文章结构
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