装饰者模式:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。
先简单描述下装饰者模式发挥作用的地方,当我们设计好了一个类,我们需要给这个类添加一些辅助的功能,并且不希望改变这个类的代码,这时候就是装饰者模式大展雄威的时候了。这里还体现了一个原则:类应该对扩展开放,对修改关闭。
例子
用装饰者模式实现在读取的txt文件内 每个名字前加编号
装饰者模式过程:
* 1.创建一个装饰类(MyBufferedReader)继承被装饰类(BufferedReader)
* 2.创建一个成员变量 类型为被装饰类
* 3.创建构造方法 用第二步创建的成员变量接收传入的装饰类
* 4.复写之前装饰类中你要增强的方法
public class MyBufferedReader extends BufferedReader{
private BufferedReader br;
public MyBufferedReader(Reader in) {
super(in);
this.br=(BufferedReader)in;
}
int num=1;
@Override
public String readLine() throws IOException {
String str=br.readLine();
if(str!=null){
str=num+":"+str;
num++;
}
return str;
}
public class BufferReader {
public static void main(String[] args) throws Exception {
FileReader fr=new FileReader("C:/Users/Administrator/Desktop/test.txt");
MyBufferedReader br=new MyBufferedReader(new BufferedReader(fr));
String str=null;
while((str=br.readLine())!=null){
System.out.println(str);
}
br.close();
}
}
例子2给武器镶嵌宝石
武器接口
public interface WuQi {
//计算攻击力
public int calculate();
//描述
public String descript();
}
具体武器斧头也是被装饰者
public class FuTou implements WuQi{
@Override
public int calculate() {
//斧头攻击力5
return 5;
}
@Override
public String descript() {
return "斧头";
}
}
宝石接口继承武器接口 装饰者继承被装饰者
public interface BaoShi extends WuQi{
}
红宝石装饰者
public class RedBaoShi implements BaoShi{
//成员变量为被装饰者
private WuQi wuqi;
//传入被装饰者
public RedBaoShi(WuQi wuqi){
this.wuqi=wuqi;
}
@Override
public int calculate() {
return 5+wuqi.calculate();
}
@Override
public String descript() {
return wuqi.descript()+"装备红宝石+1 ";
}
}
测试
public class Test {
public static void main(String[] args) {
WuQi wuqi =new RedBaoShi(new RedBaoShi(new RedBaoShi(new FuTou()))) ;
System.out.println(wuqi.calculate());
System.out.println(wuqi.descript());
}
}
结果:10 斧头装备红宝石+1
这样在不改变斧头原有方法的同时,添加了装饰宝石。使被装饰者斧头的攻击力更强。
Java的API中也有装饰者模式的身影,如果你初学Java,一定记得Java里面的各种流,很痛苦吧,但是当你明
白你们的设计之后就会感觉清晰很多。