结构型模式-适配器模式(Adapter)

一:定义:

Adapter:Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.

二:引入

先来看张图:

墙上的插座是三相的,而我手头的电器(如吹风机是两相的),那么我们就需要一个三相转两相的一个插头.

这个三相转两相的转换器就叫Adapter,对已有的接口不符合我们需要的接口时,写一个转换的接口,来完成对接功能.

  

/*
 * 已有接口
 
*/

public   class  Util  {

    
public static void printCollection(Iterator iter)
    
{
        
while(iter.hasNext())
        
{
            System.out.println(iter.next());
        }

    }

}


public   class  Client  {

    
public static void main(String[] args) {

        List list
=new ArrayList();
        list.add(
"L1");
        list.add(
"L2");
        list.add(
"L3");
        Util.printCollection(list.iterator());
        
        Vector vct
=new Vector();
        vct.add(
"v1");
        vct.add(
"v2");
        vct.add(
"v3");
        
//Util.printCollection(vct.elements()); 不符合接口
        Util.printCollection(new EnumerationIterator(vct.elements()));            
    }

}


/*
 * Adapter--Adapter,Iterator 是target,目标是要转成Iterator
 
*/

public   class  EnumerationIterator  implements  Iterator {
    
private Enumeration enumeration;
    
//Enumeration为Adaptee
    public EnumerationIterator(Enumeration enumeration)
    
{
        
this.enumeration=enumeration;
    }

    
public boolean hasNext() {
        
        
return enumeration.hasMoreElements();
    }

    
public Object next() {

        
return enumeration.nextElement();
    }

    
public void remove() {
        
    }

}

 

          

三:结构

    

adapter class

adapter object

四:实际应用

  1.  

 

五:优缺点

参考文献:
1:阎宏,《Java与模式》,电子工业出版社
2:Eric Freeman & Elisabeth Freeman,《Head First Design Pattern》,O'REILLY

    

一:定义:

Decorator:Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

二:引入

假设现在有一家咖啡店,经营咖啡,茶等饮料,我们来为它设计一个系统。

 

问题:

  • 饮料加糖或牛奶等调料时是要另收费的(每包1元),顾客可以要也可以不要,所以这个固定价格的cost方法不符合要求. 不符合OCP(open for extension,close for modification)

重新设计:

很显然,这种设计也不合适,会导致

  • 类数量爆炸性增长(class exploson).
  • 也不符合要求,比如有的顾客要两包糖等情况没有考虑到.

引入Decorator设计模式:

public   abstract   class  Beverage  {
    
private String discription;

    
    
public String getDiscription() {
        
return discription;
    }


    
public void setDiscription(String discription) {
        
this.discription = discription;
    }


    
public abstract double cost() ;
}



public   class  Coffee  extends  Beverage {
    
public Coffee()
    
{
        setDiscription(
"coffee");
    }

    
public  double cost() 
    
{
        
return 10;
    }

}



public   abstract   class  CondimentDecorator  extends  Beverage {
    
public abstract String getDiscription() ;
}


public   class  CondimentMilk  extends  CondimentDecorator {
    
private Beverage beverage;
    
public CondimentMilk(Beverage beverage)
    
{
        
this.beverage=beverage;
    }

    
public  double cost() 
    
{
        
return beverage.cost()+1;
    }

    
public  String getDiscription() 
    
{
        
return beverage.getDiscription()+",milk";
    }

}



public   class  Client  {
    
public static void main(String args[])
    
{
        Beverage coffee
=new Coffee();
        System.out.println(coffee.getDiscription()
+":"+coffee.cost());
        System.out.println(
new CondimentMilk(coffee).getDiscription()+":"+new CondimentMilk(coffee).cost());
        System.out.println(
new CondimentSugar(new CondimentMilk(coffee)).getDiscription()+":"+new CondimentSugar( new CondimentMilk(coffee)).cost());
        System.out.println(
new CondimentSugar(new CondimentSugar(new CondimentMilk(coffee))).getDiscription()+":"+new CondimentSugar(new CondimentSugar( new CondimentMilk(coffee))).cost());
    }

}



 

三:结构

    

四:实际应用

  1. JAVA IO

 

五:适用情形

Use the Adapter pattern when

  • you want to use an existing class, and its interface does not match the one you need.

     

  • you want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't necessarily have compatible interfaces.

     

  • (object adapter only) you need to use several existing subclasses, but it's impractical to adapt their interface by subclassing every one. An object adapter can adapt the interface of its parent class.

参考文献:
1:阎宏,《Java与模式》,电子工业出版社
2:Eric Freeman & Elisabeth Freeman,《Head First Design Pattern》,O'REILLY

     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值