简析策略模式

装饰模式

介绍:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活
例子:采用<<大话设计模式>>小菜穿衣服的例子。就以男人为例,上班时会着装正式(领带、衬衫、外套、西裤、皮鞋、手表等),睡觉时会穿舒适(睡衣、睡裤等),运动时会穿运动服(T恤衫、运动裤、运动鞋等)。
代码实现

  1. 第一个版本
    在这里插入图片描述
    按此类图写出来的代码能实现功能,但如果想增加‘超人’的装扮,修海需要当前类,违反了开放-封闭原则。
  2. 第二个版本(利用继承机制)
    在这里插入图片描述
    其中人和服装之间是聚合关系,服饰和下方,男人和上班的男人之间为继承关系,此版本的代码
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();
    }
}

可以单步调试结果是怎么打印出来的,是个很有意思的过程。
目前不是很理解这个方法的优缺点,只是跟着例子过了一遍,希望以后对这个有更深的理解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值