设计模式学习之装饰者模式
装饰者模式:对象的动态组合,动态地给一个对象添加一些额外的职责
。
使用情况:遇到当不想创建太多子类时,可以考虑下这个模式。装饰者模式比创建子类更具灵活性。
联想思考:关键字装饰,联想生活,人可以穿各种不一样的衣服,可以使用各种交通工具,房子可以有不一样的装修,游戏人物可以装备不同装备等。
举例实践:小明,看了英雄联盟,也想上拥有超能力,然后行侠仗义。于是他找到了大湿。大湿想了想,于是给了他几个工具,他穿上几个工具就可以上天遁地了。
实现:
听说实现啥都得接口先上,下面是小明要能穿上上面的工具必须先有使用工具的条件,就是要实现一个接口。
大湿工具模板
然后看具体实现过程
运行结果
兴奋的小明,带上了假面,穿上了飞翔翼,背上氧气瓶
小明,穿上了飞翔翼
有了这些装备后,小明从此成为了神秘大侠。
思考:上面的代码实现了动态生成句子(广告:麻麻再也不用担心我的语文成绩了)。原句只是小明,然后通过组合生成了一句话,实现了装饰这个效果。有人说,如果装饰类多,会不会造成装饰类膨胀?
使用情况:遇到当不想创建太多子类时,可以考虑下这个模式。装饰者模式比创建子类更具灵活性。
联想思考:关键字装饰,联想生活,人可以穿各种不一样的衣服,可以使用各种交通工具,房子可以有不一样的装修,游戏人物可以装备不同装备等。
举例实践:小明,看了英雄联盟,也想上拥有超能力,然后行侠仗义。于是他找到了大湿。大湿想了想,于是给了他几个工具,他穿上几个工具就可以上天遁地了。
实现:
听说实现啥都得接口先上,下面是小明要能穿上上面的工具必须先有使用工具的条件,就是要实现一个接口。
public interface Roleable {
public void operation();
}
有接口后,小明得实现这个接口,这是踏出实现梦想的第一步
public class Role implements Roleable{
private String name;
public Role(String name) {
// TODO Auto-generated constructor stub
this.name=name;
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.print(this.name);
}
}
好了,小明已经准备好了,我们再看看大湿的工具
大湿工具模板
public abstract class AbsDecrator implements Roleable {
private Roleable roleable;
public AbsDecrator(Roleable roleable) {
// TODO Auto-generated constructor stub
this.roleable=roleable;
}
public abstract void beforOperaction();
public abstract void afterOperaction();
@Override
public void operation() {
// TODO Auto-generated method stub
beforOperaction();
this.roleable.operation();
afterOperaction();
}
}
然后又模板生成飞行磨具
public class FlyDecrator extends AbsDecrator {
public FlyDecrator(Roleable roleable) {
super(roleable);
// TODO Auto-generated constructor stub
}
@Override
public void beforOperaction() {
// TODO Auto-generated method stub
}
@Override
public void afterOperaction() {
// TODO Auto-generated method stub
System.out.print(",穿上了飞翔翼");
}
}
游泳模具
public class SwimDecrator extends AbsDecrator{
public SwimDecrator(Roleable roleable) {
super(roleable);
// TODO Auto-generated constructor stub
}
@Override
public void beforOperaction() {
// TODO Auto-generated method stub
System.out.print("一天,");
}
@Override
public void afterOperaction() {
// TODO Auto-generated method stub
System.out.println(",背上氧气瓶");
}
}
小明比较低调,想行侠仗义时带上面具
public class MaskDecrator extends AbsDecrator{
public MaskDecrator(Roleable roleable) {
super(roleable);
// TODO Auto-generated constructor stub
}
@Override
public void beforOperaction() {
// TODO Auto-generated method stub
}
@Override
public void afterOperaction() {
// TODO Auto-generated method stub
System.out.print(",带上了假面");
}
}
然后看具体实现过程
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Role xiaoming=new Role("小明");
Roleable roleable=new SwimDecrator(new FlyDecrator(new MaskDecrator(new Role("小明"))));
roleable.operation();
Roleable roleable2=new FlyDecrator(new Role("小明"));
roleable2.operation();
}
}
运行结果
兴奋的小明,带上了假面,穿上了飞翔翼,背上氧气瓶
小明,穿上了飞翔翼
有了这些装备后,小明从此成为了神秘大侠。
思考:上面的代码实现了动态生成句子(广告:麻麻再也不用担心我的语文成绩了)。原句只是小明,然后通过组合生成了一句话,实现了装饰这个效果。有人说,如果装饰类多,会不会造成装饰类膨胀?