首页 > 代码库 > 设计模式-01
设计模式-01
1 接口设计模式
适用于:需要对一个类或一组类的方法进行定义或重定义的场景
package com.beifeng.hadoop.pattern.interfacee; /** * @Description 接口定义 */ public interface IPersonService { String getName(); void sayHello(); }
package com.beifeng.hadoop.pattern.interfacee; /** * @Description 接口实现类 */ public class PersonServiceImpl implements IPersonService { public String getName() { return this.getClass().getName(); } public void sayHello() { System.out.println("hello "+getName()); } }
2 适配器模式(adapter)
设计目标:使用不同接口的类所提供的服务为客户端提供它所期望的接口
使用场景:如果客户端已经提供了接口和实现类,但不能满足需要时,自定义一个新的类继承原实现类并实现接口
2.2 分类:
类适配器:新的适配器类实现需要的接口,并继承现有的类
对象适配器(没有接口的情况):继承实现类,并在内部引用现有类, 如果适配类需要从多个对象中获取信息,通常也使用对象适配器
package com.beifeng.hadoop.pattern.adapter; import com.beifeng.hadoop.pattern.interfacee.PersonServiceImpl; /** * @Description 客户端实现类 */ public class ClientPerServiceImpl extends PersonServiceImpl{ }
package com.beifeng.hadoop.pattern.adapter; import com.beifeng.hadoop.pattern.interfacee.IPersonService; /** * @Description 类适配器:继承现有实现类并实现接口 */ public class ClassPersonServeiceImpl extends ClientPerServiceImpl implements IPersonService { public void showClient() { System.out.println("client is "+System.getProperty("os.name")); } }
package com.beifeng.hadoop.pattern.adapter; import com.beifeng.hadoop.pattern.interfacee.PersonServiceImpl; /** * @Description 对象适配器:假如没有接口提供 */ public class ObjectPersonServiceImpl extends PersonServiceImpl { private ClientPerServiceImpl clientPerServiceImpl; public ObjectPersonServiceImpl(ClientPerServiceImpl clientPerServiceImpl) { super(); this.clientPerServiceImpl = clientPerServiceImpl; } @Override public String getName() { return clientPerServiceImpl.getName(); } @Override public void sayHello() { System.out.println("client is "+System.getProperty("os.name")); clientPerServiceImpl.sayHello(); } }
3 外观模式 (facade)
目标:简化工具包的使用,为子系统提供一个接口,便于使用
实例程序:可以独立运行,却无法重用,仅用于演示使用子系统的方法
外观类:可配置,可重用类,提供了高层次的接口,使得子系统使用更加方便。
4 合成模式(composite):一组对象的组合
目标:为了保证客户端调用但对象和组合对象的一致性
两个特征:
1) 组对象允许包含单对象,也可以包含其他的组对象
2 ) 组合对象和单对象定义共同的行为
5 桥接模式(bridge)
使用场景:某个类具有两个或两个以上的维度变化,如果只使用继承设计将会很臃肿,可以将继承关系改为耦合关系
6 观察者模式(observer)
目标:在多个对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,会通知依赖他的对象,并根据新状态做出相应的反应。
实现步骤:被观察者中添加观察者列表,当被观察者发生变化时,调用方法,通知观察者列表中的所用观察者的方法
主题接口(被观察者接口)的 3个基本操作:注册新的观察者,通知所有观察者更新数据,移除取消观察的观察者对象
/**主题接口:被观察者 3个基本操作:注册新的观察者,通知所有观察者更新数据,移除取消观察的观察者对象*/ public interface Subject { //注册观察者 void registerObserver(Observer observer); //移除取消观察的观察者对象 void removeOberver(Observer observer); //通知所用观察者 void notifyObervers(); }
/**被观察者实现类,气象站 */ public class WeatherData implements Subject { //观察者列表 private ArrayList<Observer> observers; private float temperature;//温度 public WeatherData() { observers=new ArrayList<Observer>(); } public void registerObserver(Observer observer) { observers.add(observer); } public void removeOberver(Observer observer) { int i=observers.indexOf(observer); if (i!=-1) { observers.remove(i); } } public void notifyObervers() { if (observers!=null&&observers.size()>0) { for(Observer observer:observers){ observer.update(temperature); } } } public float getTemperature() { return temperature; } public void setTemperature(float temperature) { this.temperature = temperature; notifyObervers(); } }
7 调停者模式(mediator)
设计目标:定义一个对象,封装一组对象的交互,从而降低对象间的耦合度,避免对象间的显示引用,而且可以独立地改变对象的行为。
适用场景:多个对象彼此互相作用,可以创建一个中间对象,让该对象持有多个对象的引用,而多个对象持有中间对象的引用,此时,
多个对象都称为同事对象,而中间对象称为调停者对象,当同事对象发生变化时可以,对用调停者对象通知要影响的同事对象
实例:使用电脑来看电影
在日常生活中,我们经常使用电脑来看电影,把这个过程描述出来,简化后假定会有如下的交互过程:
(1)首先是光驱要读取光盘上的数据,然后告诉主板,它的状态改变了。
(2)主板去得到光驱的数据,把这些数据交给CPU进行分析处理。
(3)CPU处理完后,把数据分成了视频数据和音频数据,通知主板,它处理完了。
(4)主板去得到CPU处理过后的数据,分别把数据交给显卡和声卡,去显示出视频和发出声音。
要使用调停者模式来实现示例,那就要区分出同事对象和调停者对象。很明显,主板是调停者,而光驱、声卡、CPU、显卡等配件,都是作为同事对象。
设计模式-01