`
Supanccy2013
  • 浏览: 213725 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

适配器(类适配器、对象适配器模式)

阅读更多
一:类适配器模式
  
     假如我们有一个Person类,这个Person类中有吹,拉方法。在系统开发到一半我们发现我们需要该类再添加两个方法弹、唱,以便实现吹、拉、弹、唱的功能。但纵观全系统,弹、唱功能只是临时使用的一次。并且Person类在全系统中已经设计合理,我们不想再去改变该类的行为。这个时候怎么办呢?别急,类适配器模式可以解决此类问题。
     也许你会说,为什么不直接在“源”中直接添加方法,答案是,适配是为了实现某种目的而为一个源类暂时性的加上某种方法,所以不能破坏原类的结构。同时不这么做也符合Java的高内聚,低耦合的原理。既然不能直接加,接着我们就来说该怎么来实现为人这个Person“源”添加弹、唱方法,而又不破坏“源”的本身结构。下面粘上源代码:
1,类适配器的目标功能(用接口来实现目标功能)
  package com.supan.shipeiqi;
  public interface Target {
    //这是类适配器模式中的目标实现接口
	public void chui();
	public void la();
	public void tan();
	public void chang();
   }

2,普通的类Person,该类在日常使用中需要添加一些方法,但又不想改变此类。
   package com.supan.shipeiqi;
   public class Person {
	private String name;
	private int age;
	public void chui(){
		System.out.println("我会吹,来自源对象的方法");
	}
    public void la(){
    	System.out.println("我会拉,来自源对象的方法");
    }
   }

3,适配器类,该类以Person为基础,在此基础上添加一些需要的方法,注意该类集成了
   Person也就是说,该类是Person的子类,拥有了Person的所有属性,可以任意操纵Person
   的属性,所以在此类中添加一些方法也就可以随意增加Person行为,实现适配的目标,这
   个类也是类适配器模式中经典核心类

   package com.supan.shipeiqi;
   public class PersonAdapter extends Person implements Target {
	public void tan() {
		System.out.println("我会弹,来自适配器中的方法");
	}
	public void chang() {
		System.out.println("我会唱,来自适配器中的方法");
	}
   }

4,测试类
   package com.supan.shipeiqi;
   public class ClassAdapterTest {
	public static void main(String[] args) {
		PersonAdapter pd = new PersonAdapter();
		pd.chui();
		pd.la();
		pd.tan();
		pd.chang();
	}
   }

5,打印结果
   我会吹,来自源对象的方法
   我会拉,来自源对象的方法
   我会弹,来自适配器中的方法
   我会唱,来自适配器中的方法

   代码看完然后要做一些说明了,为什么称其为类适配模式呢?很显然的,Adapter类继承了Person类,而在Java这种单继承的语言中也就意味着,他不可能再去继承其他的类了,这样也就是这个适配器只为Person这一个类服务。所以称其为类适配模式。
   说完类的适配模式,开始说第2种对象的适配器模式了。对象适配器模式是把“源”作为一个对象聚合到适配器类中。

二:对象适配器模式
1,目标接口
   package com.supan.shipeiqi;
   public interface Target {
    //这是类适配器模式中的目标实现接口
	public void chui();
	public void la();
	public void tan();
	public void chang();
   }

2,Person源类
   package com.supan.shipeiqi;
   public class Person {
private String name;
private int age;
public void chui(){
System.out.println("我会吹,来自源对象的方法");
}
    public void la(){
    System.out.println("我会拉,来自源对象的方法");
    }
   }
3,对象适配器类,该类是核心类(注意与类适配器类的区别)
   package com.supan.shipeiqi;
   public class PersonAdapter2 implements Target {
	private Person p;
	public PersonAdapter2(Person p) {
        this.p = p; 
	}
	public void chui() {
		p.chui();
	}
	public void la() {
        p.la();		
	}
	public void tan() {
        System.out.println("我会弹,该方法来自适配器");
	}
	public void chang(){
		System.out.println("我会唱,该方法来自适配器");
	}
   }
   

4,测试类:
  package com.supan.shipeiqi;
  public class ObjectAdapterTest {
	public static void main(String[] args) {
		Person p = new Person();
		PersonAdapter2 pa2 = new PersonAdapter2(p);
		pa2.chui();
		pa2.la();
		pa2.tan();
		pa2.chang();
	}
   }

5,输出:
我会吹,来自源对象的方法
我会拉,来自源对象的方法
我会弹,该方法来自适配器
我会唱,该方法来自适配子
 

三:关于类适配器模式、对象适配器模式的一点思考:
   1.类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。

   2.适配器模式主要用于几种情况:
     (1)系统需要使用现有的类,但现有的类不完全符合需要。
     (2)讲彼此没有太大关联的类引进来一起完成某项工作(指对象适配)。
   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics