[最全]设计模式实战(七)装饰&享元&外观&桥接

装饰模式

定义及使用场景:

定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。比如:人穿着各式各样的衣服。

使用场景:需要透明且动态地扩展类的功能时。

基本用法:

1.Component:抽象组件。被装饰的抽象/原始对象。

2.ConcreteComponent:组件具体实现类。被装饰的具体对象。

3.Decorator:抽象装饰者。大多数情况下,为抽象类。

4.ConcreteDecoratorA:装饰者具体实现类。

public abstract class Component {
    /**
     * 抽象的方法,这个随你做
     * 同样地你也可以增加更多的抽象方法
     */
    public abstract void operate();
}

public class ConcreteComponent extends Component {
    @Override
    public void operate() {
        // 具体逻辑,这个随你做
    }
}

public abstract class Decorator extends Component {
    private Component component;// 持有—个Component对象的引用
    /**
     * 必要的构造方法 需要—个Component类型的对象
     * @param component Component对象
     */
    public Decorator(Component component) {
        this.component = component;
    }
    @Override
    public void operate() {
        component.operate();
    }
}

public class ConcreteDecoratorA extends Decorator {
    protected ConcreteDecoratorA(Component component) {
        super(component);
    }
    @Override
    public void operate() {
        // 装饰方法A和B既可在父类方法前调用也可在之后调用
        operateA();
        super.operate();
        operateB();
    }
    /**
     * 自定义的装饰方法A
     */
    public void operateA() {
        // 装饰方法逻辑……
    }
    /**
     * 自定义的装饰方法B
     */
    public void operateB() {
        // 装饰方法逻辑……
    }
}

public class Client {
    public static void main(String[] args) {
        // 构造被装饰的组件对象
        Component component = new ConcreteComponent();
        // 根据组件对象构造装饰者对象A并调用,此时相当于给组件对象增加装饰者A的功能方法
        Decorator decorator = new ConcreteDecoratorA(component);
        decorator.operate();
        // 根据组件对象构造装饰者对象B并调用,此时相当于给组件对象增加装饰者B的功能方法
        Decorator decoratorB = new ConcreteDecoratorB(component);
        decoratorB.operate();
    }
}

装饰模式实战:

人穿着各式各样的衣服。

public abstract class Person {
    /**
     * Person下有—个穿着的抽象方法
     */
    public abstract void dressed();
}

public class Boy extends Person {
    @Override
    public void dressed() {
        // Boy类下dressed方法的基本逻辑
        System.out.println("穿了内衣内裤");
    }
}

public abstract class PersonCloth extends Person {
    protected Person mPerson;// 保持—个Person类的引用
    public PersonCloth(Person mPerson) {
        this.mPerson = mPerson;
    }
    @Override
    public void dressed() {
        // 调用Person类中的dressed方法
        mPerson.dressed();
    }
}

public class CheapCloth extends PersonCloth {
    public CheapCloth(Person mPerson) {
        super(mPerson);
    }
    /**
     * 穿短裤
     */
    public void dressShorts() {
        System.out.println("穿条短裤");
    }
    @Override
    public void dressed() {
        super.dressed();
        dressShorts();
    }
}

public class Main {
    public static void main(String[] args) {
        // 首先我们要有—个Person男孩
        Person person = new Boy();
        // 然后为他穿上便宜的衣服,比如爱哥这样的Boy
        PersonCloth clothCheap = new CheapCloth(person);
        clothCheap.dressed();
        // 或者给他穿上比较上档次的衣服,如SM
//        PersonCloth clothExpensive = new ExpensiveCloth(person);
//        clothExpensive.dressed();
    }
}

安卓中的装饰模式:

Activity 与 Context 之间的关系就使用了装饰模式。

Context 是一个抽象类,它定义了应用程序的运行上下文环境。而 Activity 是 Context 的一个具体实现,它代表了一个具有用户界面的应用程序组件。

在 Android 源码中,Context 有以下几个装饰类:

  • ContextThemeWrapper:用于设置 Activity 的主题。

  • ContextWrapper:用于包装 Context 对象,提供一些额外的功能。

    </
  • 33
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张云瀚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值