设计模式(二)

来源:互联网 发布:网络用语dp什么意思 编辑:程序博客网 时间:2024/06/07 23:41
 设计模式这一块,虽然说很常见、普通的东西,但是单独拿出一个概念让你举例说明的话,还真不一定信手拈来,而这一块确实包含着非常丰富的知识和经验,所以很多公司面试的时候也非常喜欢聊到相关的知识,因此在这里再学习、整理一下相关的知识及主要模式的详细案例。

2.结构型模式:适配器、代理、装饰器

1.适配器:作为两个不兼容的接口之间的桥梁;将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器继承或依赖已有的对象,实现想要的目标接口。

public class MediaAdapter implements MediaPlayer {

AdvancedMediaPlayer advancedMusicPlayer;

public MediaAdapter(String audioType){
if(audioType.equalsIgnoreCase(“vlc”) ){
advancedMusicPlayer = new VlcPlayer();
} else if (audioType.equalsIgnoreCase(“mp4”)){
advancedMusicPlayer = new Mp4Player();
}
}

@Override
public void play(String audioType, String fileName) {
if(audioType.equalsIgnoreCase(“vlc”)){
advancedMusicPlayer.playVlc(fileName);
}else if(audioType.equalsIgnoreCase(“mp4”)){
advancedMusicPlayer.playMp4(fileName);
}
}
}
适配器相当于提供了一个扩展功能的接口,原类只能播放mp3,调用适配器可播放vlc和mp4;

2.代理:为访问对象提供一种代理以控制对这个对象的访问。(在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层/中间层)(快捷键、代售点、spring aop)

public class ProxyImage implements Image{

private RealImage realImage;
private String fileName;

public ProxyImage(String fileName){
this.fileName = fileName;
}

@Override
public void display() {
if(realImage == null){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
通过ProxyImage 来访问realImage类的对象;

3.装饰器:动态的给一个对象添加一些额外的职责. 

比如java.io包. BufferedInputStream封装了FileInputStream, 它们都实现了InputStream接口, 但前者实现了readLine方法.

3.行为型模式:观察者、命令、策略

1.观察者:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。使用面向对象技术,可以将这种依赖关系弱化。在抽象类里有一个 ArrayList 存放观察者们。(使用场景:有多个子类共有的方法,且逻辑相同;重要的、复杂的方法,可以考虑作为模板方法)2.命令:是一种数据驱动的设计模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 将"行为请求者"与"行为实现者"解耦,将一组行为抽象为对象,实现二者之间的松耦合。

Stock abcStock = new Stock(); //股票类

BuyStock buyStockOrder = new BuyStock(abcStock); //买股票抽象类
SellStock sellStockOrder = new SellStock(abcStock);//卖股票抽象类

Broker broker = new Broker(); //经纪人类,调用对象
broker.takeOrder(buyStockOrder);
broker.takeOrder(sellStockOrder); //传递命令给相应对象

3.策略:各种策略(算法)的对象及其行为进行封装,共同实现同一个接口。(算法可以自由切换;避免使用多重条件判断;扩展性良好)

public interface Strategy { //共同的接口
public int doOperation(int num1, int num2);
}
具体定义实现类继承接口完成加减乘除等;
public class Context { //对象及其行为的封装类(公共调用类)
private Strategy strategy;

public Context(Strategy strategy){
this.strategy = strategy;
}

public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
//具体操作调用
Context context = new Context(new OperationAdd());
context.executeStrategy(10, 5);

借鉴:http://www.runoob.com/design-pattern/factory-pattern.html

原创粉丝点击