io流(装饰模式)

设计模式

  • 解决问题最行之有效的方式——(共有23种设计模式)高琪300集中全讲了
  • 现在介绍IO流中涉及到的设计模式

装饰模式

  • 它是在不改变原类文件的情况下,扩展一个对象的功能
  1. 要给一个对象增添功能,之前我们会给父类或该类增添属性方法,改变了源码
  2. 再就是将所有子类的情况写完,这样就不需要改变源码,但是这是类体系的快速膨胀
  3. 所以我们就要用到装饰模式

装饰模式的实例:

思维图:

io流(装饰模式)

具体代码:

package com.bjsxt.test10;
//制作蛋糕的接口
public interface MakeCake {
    void make();
}
//父类:蛋糕
abstract class Cake implements MakeCake{
    @Override
    public abstract void make();
}
//子类:巧克力蛋糕
class ChocoCake extends Cake{
    @Override
    public void make() {
        System.out.println("制作一个巧克力蛋糕");
    }
}
//子类:抹茶蛋糕
class MoChaCake extends Cake{
    @Override
    public void make() {
        System.out.println("制作一个抹茶蛋糕");
    }
}
//修饰的父类
class Decorater implements MakeCake{
    //修饰谁?
    private MakeCake mc;

    public Decorater(MakeCake mc){
        this.mc=mc;
    }
    @Override
    public void make() {
        mc.make();
    }
}
//子类:加口红来修饰
class DecKouHong extends Decorater{
    public DecKouHong(MakeCake mc) {
        super(mc);
    }
    @Override
    public void make() {
        super.make();
        add();
    }
    public void add(){
        System.out.println("在蛋糕中塞入一个口红!");
    }
}
class DecZuanJie extends Decorater{
    public DecZuanJie(MakeCake mc) {
        super(mc);
    }
    @Override
    public void make() {
        super.make();
        add();
    }
    public void add(){
        System.out.println("在蛋糕中加入一个钻戒!");
    }
}
class Test{
    public static void main(String[] args) {
        ChocoCake cc = new ChocoCake();
        cc.make();
        System.out.println("---------------------------------");
        DecKouHong dkh = new DecKouHong(cc);
        dkh.make();
        System.out.println("---------------------------------");
        //重点就在这里:一定要理解清晰
        /*
        第一步:走有参构造
        第二部:就是走父类的make,然后走到修饰的子类中的make(做一个蛋糕,加一个口红),dkh.make就是走口红类中的make方法
        第三步:走add方法,加一个钻戒
         */
        DecZuanJie dzj = new DecZuanJie(dkh);
        dzj.make();
        System.out.println("----------------------------------");
        //我想买一个带钻戒和口红的抹茶蛋糕
        new DecKouHong(new DecZuanJie(new MoChaCake())).make();
    }
}
上一篇:对象与原型之间的关系


下一篇:第八章?Nginx Web快速入门-基础