android 设计模式 ——装饰者模式(给你的代码穿上漂亮的衣服 )

今天学习到装饰者模式,在此做一下记录,并且分享一下。

说到装饰者模式,那什么是装饰者模式呢?他有什么作用和好处呢?只说定义,感觉太乏味,我个人通俗的理解就是:人穿衣服,穿各种各样的衣服,佩戴各种首饰等等。都可以认为是一种装饰着模式。类似这样的情景,在生活中还是有很多的。

至于作用和好处可想而知:它可以在不改变对象的情况下,任意动态地扩展对象的功能。动态地给一个对象添加一些额外的职责。就增加功能来说,装饰者模式相比生成子类更为灵活。

下面说说一个具体的例子:

(1):首先定义一个 Person 抽象类:

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

}

(2):再写一个 PersonCloth 类继承 Person 类:(他们之间属于 聚合关联关系)

public abstract class PersonCloth extends Person {

    protected Person mPerson; //保持一个Person 类的引用


    public PersonCloth(Person mPerson) {
        this.mPerson = mPerson;
    }


    @Override
    public void dressed() {
        mPerson.dressed();
    }
}

(3):定义一个具体被装饰者的对象,也继承 Person 类

public class Boy extends Person {
    private String name;

    public Boy(String name) {
        this.name = name;
    }


    @Override
    public void dressed() {
        System.out.println(name + "穿上了衣服啦!穿的衣服是这样的:");
    }
}

(4):定义装饰者,昂贵的衣服 ExpensiveCloth 类


/**
 * Created by abc on 2016/12/27.
 * <p>
 * 昂贵的衣服 类
 */

public class ExpensiveCloth extends PersonCloth {
    public ExpensiveCloth(Person mPerson) {
        super(mPerson);//子类中 调用父类的构造方法

    }


    @Override
    public void dressed() {
        super.dressed();
        dressShirt();
        dressLeather();
    }


    private void dressShirt() {
        System.out.println("360 的短袖 800元");
    }


    private void dressLeather() {
        System.out.println("貂皮的大衣 3万");
    }


}

同理:

/**
 * Created by abc on 2016/12/27.
 * <p>
 * 普通的衣服 类
 */

public class CheapCloth extends PersonCloth {
    public CheapCloth(Person mPerson) {
        super(mPerson);//子类中 调用父类的构造方法
    }


    @Override
    public void dressed() {
        super.dressed();
        dressShirt();
        dressLeather();
    }


    private void dressShirt() {
        System.out.println("普通 的短袖 100元");
    }


    private void dressLeather() {
        System.out.println("普通的大衣 1000元");
    }


}

(5):最后就是具体的实现:

                Boy boy = new Boy("小米");
                Person person = boy;

                ExpensiveCloth expensiveCloth = new ExpensiveCloth(person);
                expensiveCloth.dressed();


                Boy boy2 = new Boy("小六");
                Person person2 = boy;

                CheapCloth cheapCloth = new CheapCloth(person);
                cheapCloth.dressed();

日志打印:
这里写图片描述

到此,这个例子基本说完了。

最后再附上一张 UML 图:

这里写图片描述

图片可能不太清晰,放大一下页面,就可以了。按住Ctrl,滚动鼠标滑轮,,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值