设计模式之装饰模式

文章结构
1.装饰模式
2.参考文章及书籍


1.装饰模式

装饰模式可以在不改变原有类和使用继承的情况下,动态的扩展功能。其实现过程与代理类似,通过创建一个包装原有类的对象来装饰原有类。

装饰模式创建一个核心构件,装饰类和被装饰类都会实现/继承这个构件。具体代码如下

/**
 * 抽象构件,最核心最原始的对象。(也可以用抽象类)
 * @author live
 *
 */
public interface IWash{
	/**
	 * 洗漱步骤
	 */
	void step();
}
/**
 * 被装饰的类
 * @author live
 *
 */
public class WashImpl implements IWash{

	@Override
	public void step() {
		System.out.println("洗脸");
	}
	
}
/**
 * 装饰角色,抽象类。其中一定包含private的指向IWash的成员。
 * @author live
 *
 */
public abstract class WashDecorator implements IWash{
	// 包含一个被修饰的对象
	private IWash iw;
	
	public WashDecorator(IWash iw){
		this.iw = iw;
	}

	@Override
	public void step() {
		this.iw.step();
	}
}
/**
 * 装饰类
 * @author live
 *
 */
public class WashBrash extends WashDecorator{
	// 把被装饰类传入
	public WashBrash(IWash iw) {
		super(iw);
	}

	@Override
	public void step() {
		this.buash();
		// 调用被装饰类的方法
		super.step();
	}
	
	private void buash(){
		System.out.println("刷牙");
	}
	
}

/**
 * 装饰类
 * @author live
 *
 */
public class WashShampoo extends WashDecorator{
	// 把被装饰类传入
	public WashShampoo(IWash iw) {
		super(iw);
	}

	@Override
	public void step() {
		
		// 调用被装饰类的方法
		super.step();
		this.washShampoo();
	}
	
	private void washShampoo(){
		System.out.println("洗头");
	}
}
public class RunDecorate {
	public static void main(String[] args) {
		IWash iw;
		// 被修饰的类
		iw = new WashImpl();
		// 将其放入修饰类种
		iw = new WashBrash(iw);
		iw = new WashShampoo(iw);
		iw.step();
	}
}

通过上面的代码可以看出装饰模式和代理模式代码结构非常相似。不管使用那种方式都能在真实的类调用的方法的前面或者后面加上自定义方法。
装饰模式:动态的扩展功能。
代理模式:为对象提供一种代理来控制对这个对象的访问。
显而易见装饰模式主要用来扩展功能,代理模式用于控制访问。代理模式对代理的对象拥有绝对的控制权,同时代理模式不能像装饰模式那样嵌套调用。

2.参考文章

https://blog.csdn.net/ljl157011/article/details/17882253
https://www.cnblogs.com/xiaolovewei/p/7751332.html
https://www.cnblogs.com/jzb-blog/p/6717349.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值