设计模式简介
什么是设计模式?
设计模式是可以重复利用的解决方案。软件开发的先驱或者前辈们将之前在开发中遇到的问题进行总结并给出了解决方案,后辈在遇到这些问题之后直接使用这些方案即可解决问题。比如盖高楼,都是先挖地基,然后再盖,如果先盖楼后挖地基,可能盖不了几层,楼就倒了。
装饰者设计模式
使用场景:
给某个对象的功能进行扩展时,可以考虑使用装饰者设计模式。
在IO流这部分内容中,JDK的源码使用了大量的装饰者设计模式。比如BufferedReader可以对FileReader进行装饰。
以去拉面馆吃拉面为例,一碗面做好后都会向里面加料装饰,所以先定义一个装饰拉面的接口,提供一个加料的方法:
/**
* 装饰拉面
*
*/
public interface NoodleDecorate {
//向拉面中加料
void addThings();
}
创建一个拉面(Noodle)类实现NoodleDecorate接口
package com.monkey1024.decorate;
/**
* 普通拉面
*
*/
public class Noodle implements NoodleDecorate {
//普通拉面做好后,会向里面添加一些东西
@Override
public void addThings() {
System.out.println("加两片肉末");
System.out.println("加一片萝卜");
System.out.println("加三根香菜");
}
}
普通的拉面做好之后,有人爱吃辣椒,想在拉面中添加辣椒,创建一个辣椒拉面(ChiliNoodle)类
/**
* 拉面加辣椒
*
*/
public class ChiliNoodle implements NoodleDecorate {
//普通拉面
private Noodle noodle;
/**
* 将普通拉面对象传入
* @param noodle
*/
public ChiliNoodle(Noodle noodle) {
this.noodle = noodle;
}
/**
* 对普通拉面进行升级
*/
@Override
public void addThings() {
//普通拉面
noodle.addThings();
//在普通拉面中添加辣椒
System.out.println("加三勺辣椒");
}
}
测试一下:
public class NoodleTest {
public static void main(String[] args) {
Noodle noodle = new Noodle();
//noodle.addThings();
ChiliNoodle cn = new ChiliNoodle(noodle);
cn.addThings();
}
}
在实际生活中你去拉面馆点了一碗拉面,做好之后如果你爱吃辣椒的话可以向里面加点辣椒,而不是让厨师重新做一碗辣椒拉面。
装饰者设计模式的优点:
不用修改被装饰对象的源码,装饰者与被装饰者耦合度不高。
网友评论