设计模式-装饰模式(七)

简介

在实现一个类的方法时,额外的增加一些功能
这类看似和代理模式的工程相同,在最后会讲解两者的差异
主要模块

  • 抽象构件
  • 具体构件
  • 抽象装饰
  • 具体装饰

例子

抽象构件

//吃饭
public interface EatAble {
    //吃这个方法
    void eat();
}

具体构件

//家里吃饭
public class House implements EatAble {
    @Override
    public void eat() {
        System.out.println("吃饭。。。。");
    }
}

抽象装饰

//抽象装饰角色
public class Decorator implements EatAble {

    private EatAble eatAble;

    public Decorator(EatAble eatAble) {
        this.eatAble = eatAble;
    }

    @Override
    public void eat() {
        eatAble.eat();
    }
}

具体装饰

//具体装饰角色
public class Outer extends Decorator {

    public Outer(EatAble eatAble) {
        super(eatAble);
    }

    @Override
    public void eat() {
        super.eat();
        pay();
    }
    
    //吃晚饭需要付钱
    private void pay() {
        System.out.println("付钱。。。。。");
    }
    
}

测试

public class Main {
    public static void main(String[] args) {
        EatAble house = new House();
        house.eat();
        System.out.println("===========================");
        EatAble outer = new Outer(new House());
        outer.eat();
// 吃饭。。。。
//===========================
// 吃饭。。。。
// 付钱。。。。。
    }
}

与代理模式的差异

①关注点不一样,代理模式关注的是访问权限,装饰模式关注的增加功能
②调用者能感知到实现装饰模式的类,代理模式感知不到,换言之代理模式不知道 究竟是哪个类完成的代理,而装饰模式需要把这个类传进去
③执行时,代理模式使用的是组合(将原对象作为属性保存起来,执行原对象方法,再执行代理对象额外的方法),装饰模式使用的是集成(首先调用super的原对象方法,在调用装饰对象的额外方法)
④装饰模式层次更加分明,可以为不能进行集成的类形成一条集成链,使用多态

    原文作者:小哀同学
    原文地址: https://blog.csdn.net/civil2java/article/details/89115618
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞