asp.net 组合模式的一个例子_php实例

复制代码 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Program
{
static void Main(string[] args)
{
var customer = new Customer
{
IsActive = true,
LateFees = 100M,
TotalRentNumber = 10
};
Console.WriteLine(customer.CanRent());
Console.ReadKey();
}
}
public interface ISpecification<T>
{
/// <summary>
/// 是否可以租赁
/// </summary>
bool IsSatisfiedBy(T entity);
/// <summary>
/// 与操作
/// </summary>
ISpecification<T> And(ISpecification<T> other);
/// <summary>
/// 否操作
/// </summary>
ISpecification<T> Not();
}
/// <summary>
/// 基类
/// </summary>
public abstract class CompositeSpecification<T> : ISpecification<T>
{
public abstract bool IsSatisfiedBy(T candidate);
public ISpecification<T> And(ISpecification<T> other)
{
return new AndSpecification<T>(this, other);
}
public ISpecification<T> Not()
{
return new NotSpecification<T>(this);
}
}
/// <summary>
/// 与操作
/// </summary>
public class AndSpecification<T> : CompositeSpecification<T>
{
private ISpecification<T> leftSpecification;
private ISpecification<T> rightSpecification;
public AndSpecification(ISpecification<T> leftSpecification, ISpecification<T> rightSpecification)
{
this.leftSpecification = leftSpecification;
this.rightSpecification = rightSpecification;
}
public override bool IsSatisfiedBy(T entity)
{
return leftSpecification.IsSatisfiedBy(entity) && rightSpecification.IsSatisfiedBy(entity);
}
}
///<summary>
///否操作
/// </summary>
public class NotSpecification<T> : CompositeSpecification<T>
{
private ISpecification<T> innerSpecification;
public NotSpecification(ISpecification<T> innerSpecification)
{
this.innerSpecification = innerSpecification;
}
public override bool IsSatisfiedBy(T entity)
{
return !innerSpecification.IsSatisfiedBy(entity);
}
}
/// <summary>
/// 是否达到最大的规定租赁数
/// </summary>
public class HasReachedMaxSpecification : CompositeSpecification<Customer>
{
public override bool IsSatisfiedBy(Customer entity)
{
return entity.TotalRentNumber > 5;
}
}
/// <summary>
/// 是否激活
/// </summary>
public class CustomerActiveSpecification : CompositeSpecification<Customer>
{
public override bool IsSatisfiedBy(Customer entity)
{
return entity.IsActive;
}
}
/// <summary>
/// 是否欠费
/// </summary>
public class CustomerHasLateFeesSpecification : CompositeSpecification<Customer>
{
public override bool IsSatisfiedBy(Customer entity)
{
return entity.LateFees > 0;
}
}
public class Customer
{
private ISpecification<Customer> hasReachedRentalThreshold;
private ISpecification<Customer> customerIsActive;
private ISpecification<Customer> customerHasLateFees;
public Customer()
{
hasReachedRentalThreshold = new HasReachedMaxSpecification();
customerIsActive = new CustomerActiveSpecification();
customerHasLateFees = new CustomerHasLateFeesSpecification();
}
/// <summary>
/// 用户租赁DVD数量
/// </summary>
public int TotalRentNumber
{
get;
set;
}
/// <summary>
/// 账户是否激活
/// </summary>
public bool IsActive
{
get;
set;
}
/// <summary>
/// 用户之前是否还欠费
/// </summary>
public decimal LateFees
{
get;
set;
}
public bool CanRent()
{
ISpecification<Customer> canRent = customerIsActive.And(hasReachedRentalThreshold.Not()).And(customerHasLateFees.Not());
return canRent.IsSatisfiedBy(this);
}
}
}

时间: 2024-09-30 04:33:09

asp.net 组合模式的一个例子_php实例的相关文章

java EJB 加密与解密原理的一个例子_php技巧

加密与解密原理的一个例子 package lockunlock;  import Java.awt.*;  import java.awt.event.*;  import java.Applet.*;  import javax.Swing.*;  import java.util.*;  public class LockUnlock extends JApplet {  private boolean isStandalone = false;  //Get a parameter val

php 面向对象的一个例子_php技巧

复制代码 代码如下: <?php class person{ //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //定义一个构造方法参数为姓名$name,性别$sex和年龄$age function __construct($name,$sex,$age){ //通过构造方法传进来的$name给成员属性$this->name赋初始值 $this->name=$name; //通过构造方法传进来的$sex给成员属

用php守护另一个php进程的例子_php实例

要用php守护另一个php进程(apache模块的运行的,还有nginx等运行的除外) a.php要守护b.php 在b.php中 通过 getmypid()函数获取当前进程的id,并将id写入c.pid文件中,如果程序执行完成将c.pid文件删除或清空 在a.php中 验证c.pid是否存在 ,是否为空,如果不为空,将pid读出,通过exec执行 ps -p pid|grep 文件名来判断是否运行,判断后执行相应操作 可能有人要问,为什么不直接 ps aux|grep 文件名,这里主要是考虑到

PHP 存取 MySQL 数据库的一个例子_php基础

<body> <center> <h2>PHP+MySQL 例子</h2> <h3><u><font color=brown>请在文本区域输入数据并且确定 </font></u></h3> <form action="<? echo $PHP_SELF?>" method=POST> <textarea cols=40 rows=5 na

分享一个PHP数据流应用的简单例子_php实例

复制代码 代码如下: <?php $count = 5; start: if($count < 5) echo "You can try {$count} time, "; echo "Put Password: "; $handle = fopen ("php://stdin","r"); $line = fgets($handle); if(trim($line) != '123456'){ $count--;

纯PHP生成的一个树叶图片画图例子_php实例

效果:   提示:保存到PHP文件然后在浏览器中打后即可看到和效果图一样的一张图片. 复制代码 代码如下: <?php $im=imagecreate(670,500); $white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF); $g = imagecolorallocate($im, 0x00, 0x00, 0x00); define("PII",M_PI/180); function drawLeaf($g,$x,$y,$L,$a

php中使用临时表查询数据的一个例子_php技巧

复制代码 代码如下: $sql3="CREATE TEMPORARY TABLE atmp_table(uid int(11),dnum int(20) not null)";  mysql_query($sql3);  $sql3="INSERT into atmp_table(uid,dnum) SELECT uid,count(soid) as dnum          FROM `cy_score2`          where (nei='下载' or nei=

ubuntu10.04配置 nginx+php-fpm模式的详解_php实例

ppa安装php-fpm安装工具包 复制代码 代码如下: $ sudo apt-get install python-software-properties   添加ppa源 复制代码 代码如下: $ sudo add-apt-repository ppa:yola/php5 安装php5-fpm 复制代码 代码如下: sudo  apt-get  updatesudo  apt-get install  php5-fpm 其它必要的软件安装接 复制代码 代码如下: sudo   apt-get

30个php操作redis常用方法代码例子_php实例

 redis的操作很多的,以前看到一个比较全的博客,但是现在找不到了.查个东西搜半天,下面整理一下php处理redis的例子,个人觉得常用一些例子.下面的例子都是基于php-redis这个扩展的. 1,connect 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返回:FALSE 示例: 复制代码 代码如下: <?php  $redis = new redis();  $result = $redis->conn