设计模式(五)装饰模式

装饰者模式:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。

先简单描述下装饰者模式发挥作用的地方,当我们设计好了一个类,我们需要给这个类添加一些辅助的功能,并且不希望改变这个类的代码,这时候就是装饰者模式大展雄威的时候了。这里还体现了一个原则:类应该对扩展开放,对修改关闭。

例子

用装饰者模式实现在读取的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里面的各种流,很痛苦吧,但是当你明

白你们的设计之后就会感觉清晰很多。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值