io流(装饰模式)

设计模式

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

装饰模式

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

装饰模式的实例:

思维图:

具体代码:

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();
    }
}

posted on   汪汪程序员  阅读(158)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示