设计模式之适配器模式、外观模式浅析
来源:互联网 发布:mac设置目标磁盘模式 编辑:程序博客网 时间:2024/06/05 15:10
外观模式强调统一和简化接口,而适配器模式强调转换接口
1、适配器模式
/** * * 适配器模式 * 将一种接口转换为用户所期望的另一种接口 * * 对象适配器--使用组合拥有被适配者接口,使用实现实现目的接口 * 类适配器--使用继承拥有被适配者与目的类 * * 目的接口:用户所期望的接口 * 被适配器接口:待转换的接口 * 适配器:实现目的接口,同时使用组合包含被适配器接口,将被适配器接口转换为目的接口 * 适配器让原本接口不兼容的类可以合作无间 * * 实例 * 火鸡与鸭子 * 鸭子会叫,也会飞 * 火鸡只会咯咯叫 飞的很近 * 将火鸡转换为鸭子 * * @author Administrator * */
package com.undergrowth.adapter;/** * * 适配器模式 * 将一种接口转换为用户所期望的另一种接口 * * 对象适配器--使用组合拥有被适配者接口,使用实现实现目的接口 * 类适配器--使用继承拥有被适配者与目的类 * * 目的接口:用户所期望的接口 * 被适配器接口:待转换的接口 * 适配器:实现目的接口,同时使用组合包含被适配器接口,将被适配器接口转换为目的接口 * 适配器让原本接口不兼容的类可以合作无间 * * 实例 * 火鸡与鸭子 * 鸭子会叫,也会飞 * 火鸡只会咯咯叫 飞的很近 * 将火鸡转换为鸭子 * * @author Administrator * */public interface Duck {public void quack();public void fly();}
绿头鸭
package com.undergrowth.adapter;/** * 绿头鸭 * @author Administrator * */public class MallardDuck implements Duck {@Overridepublic void quack() {// TODO Auto-generated method stubSystem.out.println("quack");}@Overridepublic void fly() {// TODO Auto-generated method stubSystem.out.println("i can fly");}}
火鸡接口
package com.undergrowth.adapter;/** * 火鸡 * @author Administrator * */public interface Turkey {public void gobble();public void fly();}
野生火鸡
package com.undergrowth.adapter;public class WildTurkey implements Turkey {@Overridepublic void gobble() {// TODO Auto-generated method stubSystem.out.println("gobble");}@Overridepublic void fly() {// TODO Auto-generated method stubSystem.out.println("i can fly,but slower");}}
将火鸡转换为鸭子的适配器
package com.undergrowth.adapter;/** * 火鸡适配器 将火鸡转换为鸭子 * * @author Administrator * */public class TurkeyAdapter implements Duck {Turkey turkey;public TurkeyAdapter(Turkey turkey) {this.turkey = turkey;}@Overridepublic void quack() {// TODO Auto-generated method stubturkey.gobble();}@Overridepublic void fly() {// TODO Auto-generated method stubturkey.fly();}}
测试类
package com.undergrowth.adapter.test;import static org.junit.Assert.*;import org.junit.Test;import com.undergrowth.adapter.Duck;import com.undergrowth.adapter.Turkey;import com.undergrowth.adapter.TurkeyAdapter;import com.undergrowth.adapter.WildTurkey;public class TurkeyAdapterTest {@Testpublic void test() {Turkey turkey=new WildTurkey();//将火鸡转为鸭子Duck duck=new TurkeyAdapter(turkey);duck.quack();duck.fly();}}
gobblei can fly,but slower
另外一个适配器实例 将枚举接口转换为迭代器接口
枚举数据类
package com.undergrowth.adapter;import java.util.Enumeration;public class NumEnum implements Enumeration{int length;int count;String[] data=null;public NumEnum(String[] data){this.data=data;count=0;length=data.length;}@Overridepublic boolean hasMoreElements() {// TODO Auto-generated method stubreturn (count<length);}@Overridepublic Object nextElement() {// TODO Auto-generated method stubreturn data[count++];}}
枚举适配器
package com.undergrowth.adapter;/** * 将Enumeration转换为Iterator */import java.util.Enumeration;import java.util.Iterator;public class EnumeIteratorAdapter implements Iterator {Enumeration enumeration;public EnumeIteratorAdapter(Enumeration enumeration){this.enumeration=enumeration;}@Overridepublic boolean hasNext() {// TODO Auto-generated method stubreturn enumeration.hasMoreElements();}@Overridepublic Object next() {// TODO Auto-generated method stubreturn enumeration.nextElement();}@Overridepublic void remove() {// TODO Auto-generated method stubthrow new UnsupportedOperationException();}}
测试
package com.undergrowth.adapter.test;import static org.junit.Assert.*;import java.util.Enumeration;import java.util.Iterator;import org.junit.Test;import com.undergrowth.adapter.EnumeIteratorAdapter;import com.undergrowth.adapter.NumEnum;import com.undergrowth.decorate.Price;public class EnumeIteratorAdapterTest {@Testpublic void test() {String[] data={"百度","谷歌","IBM","Oracle","Microsoft","HP","Lenovo","Tecent"};Enumeration enumeration=new NumEnum(data);Iterator iterator=new EnumeIteratorAdapter(enumeration);while(iterator.hasNext()){System.out.println(iterator.next());}}}
输出
百度谷歌IBMOracleMicrosoftHPLenovoTecent
2、外观模式
/** * 设计原则: * 最少知识原则:只和你的密友交谈 * 为了只和你的密友交谈,对象中方法应该只出现在一下四种情况调用 * 1、对象本身中 * 2、对象作为其他对象的任何组件 * 3、对象作为方法参数进行传递 * 4、此方法所创建的实例化对象中 * 1、3、4的意味着不要在调用其他方法返回的对象上调用其方法 * * * 外观模式 * 提供了一个统一的接口,用来访问子系统的一群接口 * 定义了一个高层接口,让子系统更容易使用 * 外观模式只是提供了一个子系统的访问接口,并不影响子系统的单独使用 * 外观强调统一和简化接口,而适配器强调转换接口 * * 示例 * 家庭影院 * * @author Administrator * */家庭影院类
package com.undergrowth.facade;/** * 设计原则: * 最少知识原则:只和你的密友交谈 * 为了只和你的密友交谈,对象中方法应该只出现在一下四种情况调用 * 1、对象本身中 * 2、对象作为其他对象的任何组件 * 3、对象作为方法参数进行传递 * 4、此方法所创建的实例化对象中 * 1、3、4的意味着不要在调用其他方法返回的对象上调用其方法 * * * 外观模式 * 提供了一个统一的接口,用来访问子系统的一群接口 * 定义了一个高层接口,让子系统更容易使用 * 外观模式只是提供了一个子系统的访问接口,并不影响子系统的单独使用 * 外观强调统一和简化接口,而适配器强调转换接口 * * 示例 * 家庭影院 * * @author Administrator * */public class HomeTheatre {Amplifier amp;Projector pro;Screen scr;Curtain cur;public HomeTheatre(Amplifier amp,Projector pro,Screen scr,Curtain cur){this.amp=amp;this.pro=pro;this.cur=cur;this.scr=scr;}public void watchMovie(){cur.close();scr.down();pro.open();amp.openAmp();amp.setPlayer(0);amp.setVolume(10);}public void closeMovie(){amp.closeAmp();pro.close();scr.up();cur.open();}}
攻放
package com.undergrowth.facade;/** * 功放 * @author Administrator * */public class Amplifier { public void openAmp(){ System.out.println("打开功放"); } public void closeAmp(){ System.out.println("关闭功放"); } public void setVolume(int volume){ System.out.println("设置音量为"+5); } public void setPlayer(int num){ switch (num) {case 1:System.out.println("设置CD播放");break;default:System.out.println("设置DVD播放");break;} }}
投影仪
package com.undergrowth.facade;/** * 投影仪 * @author Administrator * */public class Projector {public void open(){System.out.println("打开投影仪");}public void close(){System.out.println("关闭投影仪");}}
package com.undergrowth.facade;/** * 将投影的屏幕放下 * @author Administrator * */public class Screen {public void down(){System.out.println("放下投影屏幕");}public void up(){System.out.println("收起投影屏幕");}}
窗帘
package com.undergrowth.facade;/** * 窗帘 * @author Administrator * */public class Curtain {public void close(){System.out.println("关上窗帘");}public void open(){System.out.println("打开窗帘");}}
测试类
package com.undergrowth.facade;import static org.junit.Assert.*;import org.junit.Test;public class HomeTheatreTest {@Testpublic void test() {Amplifier amp=new Amplifier();Projector pro=new Projector();Screen scr=new Screen();Curtain cur=new Curtain();HomeTheatre homeTheatre=new HomeTheatre(amp, pro, scr, cur);homeTheatre.watchMovie();System.out.println("=================我是分割线==================");homeTheatre.closeMovie();}}
输出
关上窗帘放下投影屏幕打开投影仪打开功放设置DVD播放设置音量为5=================我是分割线==================关闭功放关闭投影仪收起投影屏幕打开窗帘
0 0
- 设计模式之适配器模式、外观模式浅析
- 设计模式之--适配器模式、外观模式
- 设计模式之适配器模式&外观模式
- 设计模式之适配器、外观模式
- 设计模式之适配器与外观模式
- php 设计模式之 代理模式,适配器模式,外观模式
- 深入浅出设计模式之命令模式、适配器模式、外观模式
- 浅析设计模式之外观模式
- iOS设计模式浅析之外观模式
- 浅析设计模式之适配器模式
- 浅析Java设计模式之适配器模式
- iOS设计模式浅析之适配器模式
- 设计模式之适配器模式与外观模式
- Head First 设计模式之适配器模式与外观模式
- 设计模式之适配器模式和外观模式
- 设计模式之适配器模式和外观模式
- 设计模式之适配器模式与外观模式
- 【设计模式】1. 适配器模式、外观模式
- oracle 10g 11g 透明数据加密(Transparent Data Encryption)
- Cognos仪表盘(三)资料分享
- Python import机制详解
- 循环队列中元素个数怎么算
- Oracle部分工作原理
- 设计模式之适配器模式、外观模式浅析
- C# 计算两个复数之和、差
- 数据存储—NSKeyedArchiver(一)
- Mac OS升级到Yosemite后一些问题
- 非递归二叉树遍历
- 博弈论入门小结
- FT232RL USB转串口TTL 黄色叹号 无法安装驱动下载不能识别 解决办法
- Openstack J版本 NUMA特性相关分析(一)
- 某点最大覆盖次数