装饰器模式
贴图
代码
package 案例1穿衣服;
//定义需要装饰的大体领域。人?房间?
//给定一个装饰动作。
interface 人 {
public void wearClothes();
}
//量体裁衣,根据人去定义什么东西去装饰人。衣服?裤子?帽子?
abstract class 衣服 implements 人 {
private 人 human;// 量体裁衣,需要一个人体模型
public 衣服(人 human) {// 确保每次穿衣服的是人
this.human = human;
}
public void wearClothes() {
human.wearClothes();
}
}
class 内衣 extends 衣服 {
public 内衣(人 human) {// 确保穿内衣的是人
super(human);
}
public void wear01() {
System.out.println("第一步:套进一件很薄的内衣");
}
@Override
public void wearClothes() {
// TODO Auto-generated method stub
super.wearClothes();
wear01();// 穿内衣
}
}
class 衬衣 extends 衣服 {
public 衬衣(人 human) {
super(human);
}
public void wear02() {
System.out.println("第二步:扣上一件帅气的衬衣");
}
@Override
public void wearClothes() {
// TODO Auto-generated method stub
super.wearClothes();
wear02();
}
}
class 外套 extends 衣服 {
public 外套(人 human) {
super(human);
}
public void wear03() {
System.out.println("第三步:披上一件大气的外套");
}
@Override
public void wearClothes() {
// TODO Auto-generated method stub
super.wearClothes();
wear03();
}
}
//定义被装饰者,被装饰者初始状态有些自己的装饰
class 老王 implements 人 {
@Override
public void wearClothes() {
// TODO Auto-generated method stub
System.out.println("今天衣服怎么穿呢");
}
}
//测试类
public class 测试类 {
public static void main(String[] args) {
人 老王 = new 老王();
衣服 cloths = new 外套(new 衬衣(new 内衣(老王)));
cloths.wearClothes();
}
}
- List item
问1:装饰器模式里的装饰者为什么要用多态传入一个被装饰对象?
答:我认为这里问题是装饰者模式的核心,装饰者也要实现一个接口,通过接口多态可以接受任何实现该接口的类的对象。比方说这里的继承抽象装饰者的具体装饰者通过多态可以传入一个没有被装饰过的对象,也可以传入被装饰过对象,比方说,在内衣类里可以穿入一个裸体老王,也可以穿入已经穿了外套的老王,只是把内衣套在外套外层。同样这里能传入老王就能传入老张老李等等。
- List item
问2:既然装饰者是因为需要多态实现接口,继承抽象装饰类。那被装饰者为啥还多此一举实现装饰接口人。比方说直接定义一个普通类“老王”不就得啦,为啥还要通过实现接口的方式呢?
答:同样还是因为多态,如果老王不实现接口“人”。那么具体的装饰者,比方说“内衣、衬衣、外套”等类想要修饰老王,那就只能在构造函数中接收老王,换成老张就修饰不了了。这是其中一个问题,还有一个致命的问题是。如果我们按照顺序穿衣服,那么“内衣”传入老王,“衬衣”类传入内衣,“外套”类类传入衬衣。这种穿衣服的顺序是不能乱的。如果老王实现了接口人。,“内衣、衬衣、外套”这些类也继承了实现接口人的抽象类“衣服”,那么他们的构造函数就可以通过多态传入任何实现接口人类或者实现接口的后代。这样的就给就是。穿内衣的不仅可以是老王,老张,老李都可以。而且不一定要先穿内衣。可以先穿衬衣,在穿内衣,再穿外套等。
- List item
问题3:接口“人”存在的意义,多态的意义?
答:接口“人”里的方法,其实就是一个动作的规范,需要后代子孙都要做这个动作。多态是为了修饰范围更广,不仅修饰老王,还可以修饰老张、老李。其次是让修饰的顺序自由。可以随意乱穿衣服。