组合模式:
背景:
1.基本对象被合并成合成对象
2.用户将合成对象作为一个基本对象看待
解决方案:
1.为基本对象定义一个接口类型
2.合成对象将包含基本对象的一个集合
3.基本类以及合成类将实现该接口类型
4.当实现一个来自接口类型的方法时,合成类需要将该方法应用到基本对象中合并其结果
类图:
实现类图:
此图显示的一个商品及商品单据的关系,每个商品需要取价格,而单据包含多个商品,需要取的是单据中所有山的总价值。
程序:
--------------------------------------------------------------------------------------------
public interface IPrice{
public double getPrice();
}
-------------------------------------------------------------------------------------
public class Product implements IPrice{
private double price;
public Product(double price){
this.price = price;
}
public double getPrice(){
return price;
}
}
--------------------------------------------------------------------------------------
public class PrductBill{
private vector productors;
public ProductBill(){
productors = new Vector();
}
public void addProduct(IPrice product){
products.add(product);
}
public double getPrice(){
double price = 0.0;
for(i=0 ; i<products.size() ; ++i){
IPrice product = (IPrice)products.elementAt(i);
price += product.getPrice();
}
return price;
}
}
修饰器模式:
背景:
1.希望改进某个类的操作
2.被修饰的类可以象一个普通组件一样使用
3.组件类并不想承担有关修饰的职责
解决方案:
1.为组件定义一个接口类型
2.用具体的组件类实现该接口类型
3.修饰器也同样实现该接口
4.一个修饰器对象管理它所修饰的组件对象
5.当实现足见接口类型的一个方法时,修饰器类将方法应用到所修饰的组件当中,并把结果与修饰的结果想结合
类图:
具体实例:
原代码:
//本程序演示使用修饰器模式的,商品打折实例
---------------------------------------------------------------------------------------------------------
public interface IPrice{
public double getPrice();
}
-------------------------------------------------------------------------------------------------------
public class Product implements IPrice{
private String name;
private double price;
public Product(String name,double price){
this.name = name;
this.price = price;
}
public double getPrice(){
return price;
}
}
--------------------------------------------------------------------------------------------------
public class DiscountedProduct{
//商品
private Product p;
//折扣率
private double d;
public DiscountedProduct(Product p , double d){
this.p = p;
this.d = d;
}
public double getPrice(){
return d*p.getPrice();
}
}
最后需要注意的是,两种模式的差别,从类图上看出,修饰器只包含一个实现相同接口的类,而组合却要包含多个,其实现实中也可以理解,组合可以组合多个,修饰只修饰一个。