- 浏览: 125234 次
- 性别:
- 来自: 深圳
文章分类
最新评论
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
例如在香港的水货手机充电器插头无法适应大陆的插座,需要一个第三方转换器。这个转换器也就是适配器。
在介绍策略模式时,有写过一个鸭子接口
package com.headfirst.chapter7; public interface Duck { public void quack(); public void fly(); }
绿头鸭是鸭子接口的子类
package com.headfirst.chapter7; public class MallardDuck implements Duck { public void fly() { System.out.println("I'm flying"); } public void quack() { System.out.println("Quack"); } }
现在再写一个火鸡接口,如下:
package com.headfirst.chapter7; /** * 火鸡接口 */ public interface Turkey { public void gollbe();//火鸡不会呱呱叫,只会咯咯叫 public void fly();//火鸡会飞,但是飞不远 }
野生火鸡是火鸡的子类,如下:
package com.headfirst.chapter7; public class WildTurkey implements Turkey{ public void fly() { System.out.println("I am flying a short distance"); } public void gollbe() { System.out.println("Gollbe Gollbe!"); } }
假设现在“市场”上缺鸭子对象,需要用一些 野生火鸡 来冒充,但这野生火鸡的接口与鸭子的接口并不同,不能公然拿来用,
那么就写个适配器,将野生火鸡转换成鸭子。
package com.headfirst.chapter7; public class TurkeyAdapter implements Duck { Turkey turkey;//有一个火鸡的引用 public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } public void fly() { for (int i = 0; i < 5; i++) { turkey.fly();//火鸡的飞行距离不如鸭子远,所以要飞5次 } } public void quack() { turkey.gollbe(); } }
写个类来测试一下:
package com.headfirst.chapter7; public class DuckTestDriver { public static void main(String[] args) { Duck duck = new MallardDuck();//绿头鸭 Turkey turkey = new WildTurkey();//野生火鸡 testDuck(duck); duck = new TurkeyAdapter(turkey);//将野生火鸡转换成绿头鸭 testDuck(duck); } private static void testDuck(Duck duck) { duck.quack(); duck.fly(); } }
最后打印出:
Quack I'm flying Gollbe Gollbe! I am flying a short distance I am flying a short distance I am flying a short distance I am flying a short distance I am flying a short distance
完成!
看看适配器模式的UML类图:
对应我们上面的例子
关于装饰者模式与适配器模式的区别:
适配器模式强调转换,将一个接口转换成另一个符合客户期望的接口。
而装饰者模式强调添加新功能,用新的功能来包装原有的对象。
再来看另一个模式:外观模式(facade-pattern),之所以这么称呼,是因为它将一个或
数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。
看下面这个例子
假设有一个家族影院系统:
内含DVD播放器,功放,投影仪,自动屏幕,环绕立体声,甚至还有爆米花。
如果要使用这套家庭影院观看一部电影,那么可能要经过以下数个步骤:
1,打开爆米花
2,开始爆米花
3,打开功放
4,放下屏幕
5,调暗灯光
6,打开投影仪
.
.
.
以下还个数个步骤
电影观看完后,还要依次按上面的步骤关闭。
现在为家庭影院创建一个外观类HomeTheaterFacade,它对外暴露出几个简单的方法,如watchMovie,endMovie。
现在用户可以调用外观类的方法,而不用再调用各个子系统的方法,所以想再利用家庭影院看电影,只需要调用一个watchMovie方法就够了,
爆米花,功放,屏幕,DVD播放器等等一口气全部搞定。
外观只是提供你更直接的操作,并将原来的子系统隔离起来。
家庭影院外观类:
public class HomeTheaterFacade{ Amplifier amp;//功放 DVDplayer player;//DVD播放器 CdPlayer cdPlayer;//cd播放器 Project project;//投影仪 ... public HomeTheaterFacade(Amplifier amp,DVDplayer player,....){ this.amp = amp; this.player = player; ..... } public void watchMovie(String movie){ System.out.println("get ready to watch movie"); amp.on(); player.on(); ...... } public void endMovie(){ System.out.println("Shutting movie now"); amp.off(); player.off(); .... } }
客户类可以直接使用这个facade类所提供的watchMovie类来观看电影,而无需再调用各个子系统的功能了。
外观模式的定义:
提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。
外观模式与适配器模式的区别:
外观和适配器可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成不同的接口。
要点:当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器,
当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观,
适配器将一个对象包装起来以改变其接口,装饰者将一个对象包装起来以增加新的行为或责任,而外观将一群对象包装起来以简化其接口。
发表评论
-
模板方法模式(Head first)
2012-06-06 22:46 1257有人爱喝茶,有人爱喝 ... -
命令模式(Head First版)
2012-05-31 01:01 1055用命令模式实现这样一个需求: 有个按钮,将一盏电灯的开和关动 ... -
设计模式:装饰模式(Head First版)
2012-05-28 23:50 884装饰者模式:动态地将责任附加到对象上,若到扩展功能,装饰者提供 ... -
观察者模式(Head First版)
2012-05-27 00:43 977观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改 ... -
单例模式(Head First版)
2012-05-23 20:29 849单例模式:确保一个类只有一个实例,并提供一个全局访问点。 ... -
工厂模式:抽象工厂
2012-05-23 17:19 778接着上一篇说过的工厂方法,这节来谈一谈抽象工厂: 首先来看一 ... -
工厂模式:工厂方法
2012-05-23 00:12 798还是利用比萨店的例子,我们来看看一般工厂模式: 如果比萨店有 ... -
工厂模式:简单工厂
2012-05-22 21:11 693为什么要使用工厂模式 ... -
设计模式:代理模式
2011-09-21 11:20 7081,抽象角色 package com ... -
设计模式:工厂模式
2011-09-18 14:27 665代码示例: 定义一个Perso ... -
设计模式:单例模式
2011-08-23 16:54 40单例模式(Singleton):表示一个类只会生成唯一的一个对 ... -
设计模式:策略模式
2011-08-16 23:02 857策略模式在集合类的Comparator中大量应用 ... -
设计模式:装饰模式
2011-08-04 00:31 808JAVA 的IO模块如果不使用装 ...
相关推荐
### 深入浅出设计模式之适配器模式与外观模式 在软件工程领域,设计模式被广泛地应用于解决常见的编程问题。其中,《Head First 设计模式》是一本非常受欢迎的经典著作,它通过生动有趣的例子帮助读者理解并掌握...
结构型模式如适配器(Adapter)、外观(Facade)、代理(Proxy)等,则致力于处理类或对象的组合和继承问题。行为型模式如策略(Strategy)、观察者(Observer)、装饰器(Decorator)和模板方法(Template Method)...
这些模式包括但不限于单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)、适配器模式(Adapter)、装饰器模式(Decorator...
- 外观模式(Facade):为子系统提供一个统一的接口,使得子系统更容易使用。 - 桥接模式(Bridge):将抽象部分与实现部分分离,使它们可以独立变化。 - 组合模式(Composite):允许你将对象组合成树形结构来...
结构型模式涉及如何组合现有的类和对象以形成更大的结构,包括适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式...
结构型模式关注如何组合现有对象来形成更大的结构,例如适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、代理模式(Proxy)和组合模式(Composite)。行为型模式则关注对象...
2. **结构型模式**:如适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、组合模式(Composite)、代理模式(Proxy)和享元模式(Flyweight)。这些模式关注的是如何将类和...
- 外观模式(Facade):为子系统提供一个统一的接口,简化客户端与其交互。 - 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 3. **行为型模式**: - 责任链模式(Chain of Responsibility...
结构型模式涉及如何组合对象和类,以创建更复杂的设计,例如适配器模式(Adapter)、装饰器模式(Decorator)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)、代理模式(Proxy)和享元模式...
2. 结构型模式:包括适配器(Adapter)、桥接(Bridge)、装饰(Decorator)、组合(Composite)、外观(Facade)、享元(Flyweight)和代理(Proxy)。这些模式处理类和对象的组合,以实现新的功能或改善已有结构。...
2. 结构型模式:关注如何组合现有类和接口以创建更大结构,如适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式...
2. 结构型模式:这类模式主要关注如何组合类和对象以创建更复杂的结构,包括适配器模式(Adapter)、装饰器模式(Decorator)、外观模式(Facade)、桥接模式(Bridge)、组合模式(Composite)、享元模式...
- 外观模式(Facade Pattern):为子系统提供一个统一的接口,使得子系统更容易使用。源码中会展示如何通过外观类简化子系统的使用。 - 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。...
6. 外观模式(Facade):为子系统提供一个统一的接口,使得这些子系统更容易被使用。外观模式简化了客户端与复杂系统之间的交互,降低了系统的耦合度。 7. 适配器模式(Adapter):使两个接口不兼容的对象能够协同...
7. 外观模式(Facade Pattern):外观模式为复杂的子系统提供了一个简单的接口,使得客户端不必关心子系统的内部结构。在Java的`java.sql.Connection` 中,它简化了数据库操作的复杂性。 这些设计模式都是软件工程...
结构型模式包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、组合模式(Composite)、代理模式(Proxy)和享元模式(Flyweight)。这些模式主要处理类与类之间的关系,...
11. **外观模式(Facade)**:为子系统提供一个统一的接口,使得这些子系统更加容易被使用。外观模式降低了客户端与子系统的耦合度。 12. **命令模式(Command)**:将请求封装为一个对象,从而使你可用不同的请求...
《HeadFirst设计模式》这本书是软件开发领域的一本经典之作,尤其对于初学者而言,它以易懂且生动的方式介绍了设计模式这一核心概念。设计模式是面向对象编程中的一种最佳实践,是解决常见问题的经验总结,是软件...