设计模式自学笔记006_Real(责任链设计模式、模板方法设计模式、享元设计模式)

设计模式自学笔记006_Real(责任链设计模式、模板方法设计模式、享元设计模式)

一、责任链设计模式

为请求创建一个接收者对象的链,这种模式对请求的发送者和接收者进行解耦。通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么他就会把相同的请求传给下一个接收者,以此类推。

那么假设现在有公司要采购办公椅,负责人是张三,他将采购计划报给自己的主管,主管以看数目太大不能自作主张,就提交给了老板,让老板决定是否购买。代码实现如下:

//接收链条的抽象类
public abstract class Handler {
    protected Handler nextHandler;
    public void setNextHandler(Handler nextHandler){
        this.nextHandler = nextHandler;
    }
    public abstract void process(Integer info);
}
//Leader类
public class Leader extends Handler{
    @Override
    public void process(Integer info) {
        if(info > 0 && info < 20000){
            System.out.println("Leader处理,批准采购计划");
        }else{
            nextHandler.process(info);
        }
    }
}
//Boss类
public class Boss extends Handler{
    @Override
    public void process(Integer info) {
        System.out.println("Boss处理,批准采购计划");
    }
}

//应用
public class ChainResponsibility {
    public static void main(String[] args) {
        Handler leader = new Leader();
        Handler boss = new Boss();
        leader.setNextHandler(boss);
        leader.process(30000);
        leader.process(10000);
    }
}
输出结果:
Boss处理,批准采购计划
Leader处理,批准采购计划

优点就是将请求和处理分开,请求者不需要知道谁去处理,矗立着也不需要知道请求者的全貌,并且可以提高系统的灵活性。但是缺点就是会增加系统的负担,每一次请求都要讲整个链条走一遍,不能越级请求。

二、模板方法模式

在程序设计中,有的一组程序需要按照固定的步骤运行,但是步骤的内容会有不同,相当于有一套固定的模板,梅一段程序套用固定的模板,根据自身的需求来实现不同的内容。

模板方法模式是建立一个模板抽象类,里面有每个步骤的抽象方法,然后最重要的有一个模板方法,里面每一个步骤都按照顺序进行,并且还有一些固定不变的其他程序,然后当我们在使用的时候,新建类,然后继承该模板抽象类,重写其中的每一个步骤随营的方法,然后调用抽象类中的模板方法就可以实现我们需要的功能。代码实现如下:

public class TempleDesignPattern1 {
    public static void main(String[] args) {
        Temple function = new Function();
        function.TempleFun();
    }
}

abstract class Temple{
    public abstract void Step1();
    public abstract void Step2();
    public abstract void Step3();
    public void TempleFun(){
        System.out.println("程序开始");
        System.out.println("不需要改变的代码");
        Step1();
        Step2();
        Step3();
        System.out.println("不需要改变的代码");
        System.out.println("程序结束");
    }
}

class Function extends Temple{
    @Override
    public void Step1() {
        System.out.println("步骤1");
    }

    @Override
    public void Step2() {
        System.out.println("步骤2");
    }

    @Override
    public void Step3() {
        System.out.println("步骤3");
    }
}
输出结果:
程序开始
不需要改变的代码
步骤1
步骤2
步骤3
不需要改变的代码
程序结束

三、享元设计模式

享元,即共享单元,类似于共享经济的概念,程序运行的时候往往会有一些对象需要重复利用,而且相同类型的对象可能内容不同,被其他程序反复利用,如果每次都重新创建实例化对象就太浪费资源了,那么我们可以使用享元设计模式,建立一个共享单元,里面事先创建一些需要用到的对象,然后共享给其他程序使用,而且事先创建的对象在同一时间只能被一个进程所拥有。

那么我们来举一个共享单车的例子,假设现在又两辆共享单车,有三个人想骑车,那么张三骑一辆,王五骑一辆,赵四只能在另两个人中一个人还车之后才能骑到自行车。代码如下:

public abstract class BikeFlyWeight {
    //内部状态
    protected Integer state = 0; //0表示自行车没人骑,1表示自行车有人骑

    //userName外部状态
    abstract void ride(String userName);
    abstract void back(); //还车

    public Integer getState(){
        return state;
    }
}

public class MoBikeFlyWeight extends BikeFlyWeight{
    //定义新的额内部状态,车架号
    private String bikeID;

    public MoBikeFlyWeight(String bikeID) {
        this.bikeID = bikeID;
    }
    //骑车
    @Override
    void ride(String userName) {
        state = 1;
        System.out.println(userName + "正在骑"+bikeID+"号自行车");
    }
    //还车
    @Override
    void back() {
        state = 0;
    }
}

public class BikeFlyWeightFactory {
    private static BikeFlyWeightFactory instance = new BikeFlyWeightFactory();
    private Set<BikeFlyWeight> pool = new HashSet<>();

    public static BikeFlyWeightFactory getInstance(){
        return instance;
    }

    private BikeFlyWeightFactory(){
        for(int i = 0; i < 2; i++){
            pool.add(new MoBikeFlyWeight(i+""));
        }
    }
    public BikeFlyWeight getBike(){
        for(BikeFlyWeight bike : pool){
            if(bike.getState() == 0) {
                return bike;
            }
        }
        return null;
    }
}

public class FlyWeightDesign01 {
    public static void main(String[] args) {
        BikeFlyWeight bike1 = BikeFlyWeightFactory.getInstance().getBike();
        bike1.ride("张三");

        BikeFlyWeight bike2 = BikeFlyWeightFactory.getInstance().getBike();
        bike2.ride("王五");
        bike2.back();

        BikeFlyWeight bike3 = BikeFlyWeightFactory.getInstance().getBike();
        bike3.ride("赵四");

        System.out.println(bike1 == bike2);
        System.out.println(bike2 == bike3);

    }
}

(1)享元设计模式也叫做蝇量设计模式,运用共享技术有效的 支持大量细粒度的对象。
(2)常用于系统底层开发,解决系统的性能问题,像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来使用,避免重新创建,如果没有我们需要的,则创建一个
(3)享元模式能够解决重复对象的内存浪费问题。当系统中有大量相似对象,需要缓冲池的时候,不需要创建新的对象,可以从缓冲池里面直接拿,这样就可以降低系统的内存,同时提高效率。
(4)享元设计模式典型的应用就是各种池技术,String常量池,数据库连接池,缓冲等都是享元模式的应用,享元模式是池技术的重要实现方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仲子_real

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值