装饰模式
介绍:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活
例子:采用<<大话设计模式>>小菜穿衣服的例子。就以男人为例,上班时会着装正式(领带、衬衫、外套、西裤、皮鞋、手表等),睡觉时会穿舒适(睡衣、睡裤等),运动时会穿运动服(T恤衫、运动裤、运动鞋等)。
代码实现:
- 第一个版本
按此类图写出来的代码能实现功能,但如果想增加‘超人’的装扮,修海需要当前类,违反了开放-封闭原则。 - 第二个版本(利用继承机制)
其中人和服装之间是聚合关系,服饰和下方,男人和上班的男人之间为继承关系,此版本的代码
Person类
public class Man{
private String name;
public Man(String name){
this.name=name;
}
public void show(){
System.out.printLn("装扮的"+name);
}
}
服饰类
public abstract class Finery{
public abstract void show();
}
//其他的类继承Finery实现方法即可
主类
public static void main(String[] args){
Man man=new Man("xiaocai");
Finery tshirts=new Tshirts();
Finery kk=new BigTrouser();
Finery pqx=new Sneakers();
tshirts.show();
kk.show();
pqx.show();
man.show();
问题:基本实现了功能,但是用继承的方法会令到子类的数量暴增并且可能存在大量重复代码,造成代码臃肿,最终就是难以维护。
3.装饰模式
代码
package com.decorate;
public class Man {
private String name;
public Man() {
}
public Man(String name) {
this.name = name;
}
public void dress(){
System.out.println("装扮的"+name);
}
}
package com.decorate;
public class Finery extends Man {
protected Man man;
public void decorate(Man man){
this.man=man;
}
public void dress(){
if(man!=null){
man.dress();
}
}
}
package com.decorate;
public class SportShoes extends Finery {
@Override
public void dress() {
System.out.println("破球鞋");
super.dress();
}
}
package com.decorate;
public class BigTrouser extends Finery{
@Override
public void dress() {
System.out.println("裤子");
super.dress();
}
}
package com.decorate;
public class Test {
public static void main(String[] args) {
Man man=new Man("小段");
//场合一:运动
Finery sportshoes=new SportShoes();
Finery tshirt=new Tshirt();
Finery bigTrouser=new BigTrouser();
sportshoes.decorate(man);
tshirt.decorate(sportshoes);
bigTrouser.decorate(tshirt);
bigTrouser.dress();
}
}
可以单步调试结果是怎么打印出来的,是个很有意思的过程。
目前不是很理解这个方法的优缺点,只是跟着例子过了一遍,希望以后对这个有更深的理解