设计模式 装饰模式

前言

装饰模式,是指动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相对于生成子类来说更加灵活。

场景引入

一个人,行为是吃喝睡,现在我们想要让这个人成为超人,也就是具有拯救世界的功能。

在这里插入图片描述
抽象装饰器AbstractDecorator拥有抽象类AbstractPerson的子类对象,并且可以对AbstractPerson的子类对象进行修饰。

这样在没有修改person类具体实现的情况下,修改成了ConcreteSuperPersonDecorator

1.抽象类
/**
 * @author 阳光大男孩!!!
 */
public abstract class AbstractPerson {
    /**
     * 动作
     */
    abstract void action();
}


2.人的具体实现类
/**
 * @author 阳光大男孩!!!
 */
public class ConcretePerson extends AbstractPerson{

    @Override
    void action() {
        System.out.println("吃...睡...");
    }
}


3.装饰抽象类
/**
 * @author 阳光大男孩!!!
 */
abstract class AbstractDecorator extends AbstractPerson {
	/**
     * 被装饰的对象
     */
    protected AbstractPerson abstractPerson;
	
    public void setPerson(AbstractPerson abstractPerson) {
        this.abstractPerson = abstractPerson;
    }
    @Override
    void action() {
        if(abstractPerson!=null)
        {
            abstractPerson.action();//实际上执行的是abstractPerson的action()方法
        }
    }
}


这个抽象类的子类能够对其他类进行装饰

4.装饰器抽象类的具体实现类
/**
 * @author 阳光大男孩!!!
 */
public class ConcreteSuperPersonDecorator extends  AbstractDecorator{
    @Override
    void action() {
        super.action();
        System.out.println("拯救世界...");
    }
}


5.测试
/**
 * @author 阳光大男孩!!!
 */
public class Main {
    public static void main(String[] args) {
        //普通人吃和睡
        ConcretePerson person = new ConcretePerson() ;
        person.action();

        System.out.println("在不改动普通人类的情况下,增加新的功能:");

        ConcreteSuperPersonDecorator csd = new ConcreteSuperPersonDecorator();
        csd.setPerson(person);
        csd.action();

    }
}

运行结果

......
在不改动普通人相关类的情况下,增加新的功能:......
拯救世界...
总结

装饰器只需要关心自己的功能,而不需要关心新增加的功能是如何添加到对象链中。

发布了211 篇原创文章 · 获赞 101 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43889841/article/details/104113407