当前位置:首页 > PHP教程 > PHP常见问题

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

代码如下:

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); 



【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!