无废话设计模式(7)结构型模式--装饰模式

0-前言

  装饰模式定义:动态给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

1-实现

1-1、易看的UML图:

1-2、代码实现:

//1、演员类(component,直接实现,未抽取父类,可抽取父类)
class  Actor
{
    public void  Act()
    {
        System.out.println("演员开始表演了");
    }
}

//2、Decorator(装饰抽象类)
class  Stylist extends Actor
{
    protected  Actor actor;

    public void  MakeActor(Actor _actor)
    {
        this.actor = _actor;
    }

    @Override
    public void Act()
    {
        if (actor !=null)
        {
            actor.Act();
        }
    }
}

//2-1、ConcreteComponentA(具体装饰者A--古装造型师)
class AncientStylist extends Stylist
{
    private String State;

    @Override
    public void Act()
    {
        System.out.println("古装造型师给演员化妆了");
        State  = "演员状态挺好的";
        System.out.println(State);
        super.Act();
    }
}

//2-2、ConcreteComponentB(具体装饰者B)
class ModernStylist extends Stylist
{
    public void AddBehaver()
    {
        System.out.println("给演员打了个气");
    }

    @Override
    public void Act()
    {
        System.out.println("现代造型师给演员化妆了");
        AddBehaver();
        super.Act();
    }

客户端:

        Actor actor = new Actor();
        AncientStylist ancientStylist =new AncientStylist();
        ModernStylist modernStylist = new ModernStylist();

        ancientStylist.MakeActor(actor);
        ancientStylist.Act();

        modernStylist.MakeActor(actor);
        modernStylist.Act();

运行结果:

2、应用场景简单总结

1、当需要以不影响其他对象为前提实现动态、透明地给单个对象添加职责时;

2、当需要将对象的某些职责进行撤销操作时;

3、当不能用生成子类的方法进行当前系统的扩充时;

原文地址:https://www.cnblogs.com/yanghj/p/13411310.html