今天学习到装饰者模式,在此做一下记录,并且分享一下。
说到装饰者模式,那什么是装饰者模式呢?他有什么作用和好处呢?只说定义,感觉太乏味,我个人通俗的理解就是:人穿衣服,穿各种各样的衣服,佩戴各种首饰等等。都可以认为是一种装饰着模式。类似这样的情景,在生活中还是有很多的。
至于作用和好处可想而知:它可以在不改变对象的情况下,任意动态地扩展对象的功能。动态地给一个对象添加一些额外的职责。就增加功能来说,装饰者模式相比生成子类更为灵活。
下面说说一个具体的例子:
(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,滚动鼠标滑轮,,