设计模式之适配器模式&外观模式

OO适配器将一个接口转换为另一个接口,以符合客户的需求。


Duck和Turkey之间的关系。。。

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

}

public class MallardDuck implements Duck{
	public void quack(){
		System.out.println("Quack");
	}
	
	public void fly(){
		System.out.println("im flying");
	}

}

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

}

public class WildTurkey implements Turkey{
	public void gobble(){
		System.out.println("Gobble gooble");
	}
	
	public void fly(){
		System.out.println("im flying a short distance");
	}

}

public class TurkeyAdapter implements Duck{
	Turkey turkey;
	
	public TurkeyAdapter(Turkey turkey){
		this.turkey=turkey;
	}
	
	public void quack(){
		turkey.gobble();
	}
	
	public void fly(){
		for(int i=0;i<5;i++)
			turkey.fly();
	}

}

测试:

public class DuckTestDrive {
	public static void main(String[]args){
		MallardDuck duck=new MallardDuck();
		
		WildTurkey turkey=new WildTurkey();
		Duck turkeyAdapter=new TurkeyAdapter(turkey);
		
		System.out.println("The turkey says...");
		turkey.gobble();
		turkey.fly();
		
		System.out.println("\nThe duck says...");
		testDuck(duck);
		
		System.out.println("\nThe turkeyAdapter says...");
		testDuck(turkeyAdapter);
	}
	
	static void testDuck(Duck duck){
		duck.quack();
		duck.fly();
	}

}

result:

The turkey says...
Gobble gooble
im flying a short distance

The duck says...
Quack
im flying

The turkeyAdapter says...
Gobble gooble
im flying a short distance
im flying a short distance
im flying a short distance
im flying a short distance
im flying a short distance

适配器让原本接口不兼容的类可以合作无间。


以上是对象的适配器,还有类的适配器

比如旧世界的枚举器Enumeration适配到新世界的迭代器Iterator,编写一个EnumerationIterator适配器


public class EnumerationIterator implements Iterator{
	Enumeration enum;
	
	public EnumerationIterator(Enumeration enum ){
		this.enum=enum;
	}

	@Override
	public boolean hasNext() {
		// TODO Auto-generated method stub
		return enum.hasMoreElement();
	}

	@Override
	public Object next() {
		// TODO Auto-generated method stub
		return enum.nextElement();
	}

	@Override
	public void remove() {
		// TODO Auto-generated method stub
		throw new UnsupportedOperationException();
	}

}

类似的还有一种模式,外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更加容易使用。

比如家庭影院系统就很适合。

Facade并没有封装子系统的类,只是提供简化的接口,所以你可以直接使用子系统的类。也允许你将客户实现从任何子系统中解耦。


外观和适配器可以包装很多类,但是前者的意图是简化接口,而后者是将接口转换成不同接口


涉及到一个设计原则:最少知识原则。也就是不要让太多的类耦合在一起。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值