HeadFirst(七)Adapter 适配器设计模式

 

适配器模式-Adapter

将一个不兼容接口的对象包装起来,变成兼容的对象

 

 

 

外观/门面模式-Facade

将一群对象包装起来,以简化接口

当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观模式

外观将客户从一个复杂的子系统中解耦

扫描二维码关注公众号,回复: 293505 查看本文章

实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行

可以为一个子系统实现一个以上的外观

 

装饰模式-Decorator

将一个对象包装起来以增加新的行为和责任

 

 

===============================================================

适配器模式示例

让火鸡变鸭子,以兼容现有接口的参数类型

 


 
 

鸭子的接口

package adapter.duck;

public interface Duck {
	public void quack();
	public void fly();
}

具体的鸭子

package adapter.duck;

public class MallardDuck implements Duck {

	@Override
	public void quack() {
		System.out.println("Quack");
	}

	@Override
	public void fly() {
		System.out.println("I'm flying");
	}

}

火鸡的接口

package adapter.turkey;

public interface Turkey {
	public void gobble();
	public void fly();
}

具体的火鸡

package adapter.turkey;

public class WildTurkey implements Turkey {

	@Override
	public void gobble() {
		System.out.println("Gobble");
	}

	@Override
	public void fly() {
		System.out.println("I'm flying a short distance");
	}

}

将火鸡伪装成鸭子

package adapter.turkey;

import adapter.duck.Duck;

/**
 * 适配器
 * 内部将火鸡伪装为鸭子
 */
public class TurkeyAdapter implements Duck {
	
	//被适配者
	Turkey turkey;
	
	public TurkeyAdapter(Turkey turkey) {
		this.turkey = turkey;
	}
	
	/**
	 * 委托被组合的对象完成任务
	 */
	@Override
	public void quack() {
		turkey.gobble();
	}

	@Override
	public void fly() {
		for(int i=0;i<5;i++) {
			//火鸡需要连续飞行5次才能抵上鸭子飞行一次
			turkey.fly();
		}
	}

}

测试:让火鸡也兼容以鸭子类型作为参数的接口

package test;

import adapter.duck.Duck;
import adapter.duck.MallardDuck;
import adapter.turkey.Turkey;
import adapter.turkey.TurkeyAdapter;
import adapter.turkey.WildTurkey;

public class AdapterTest {
	public static void main(String[] args) {
		
		Duck duck = new MallardDuck();
		
		Turkey turkey = new WildTurkey();
		Duck turkeyAdapter = new TurkeyAdapter(turkey);
		
		System.out.println("The Turkey says:");
		turkey.gobble();
		turkey.fly();
		
		System.out.println("\nThe Duck syas:");
		testDuck(duck);
		
		System.out.println("\nThe TurkeyAdapter syas:");
		testDuck(turkeyAdapter);//通过适配器,让火鸡变为鸭子去了
	}

	private static void testDuck(Duck duck) {
		duck.quack();
		duck.fly();
	}
}

 

===============================================================

Enumeration适配器



 

 

 

猜你喜欢

转载自schy-hqh.iteye.com/blog/1990020