java设计模式之装饰(Decorator)模式

 

一、设计模式【一种固定代码风格】

            面试题:Java中有哪些设计模式

            常用设计模式:装饰模式、单例模式、模版模式、适配器模式、代理模式、工厂模式...

      

二、装饰(Decorator)设计模式

  1.装饰模式的概念:

               装饰模式是动态的给一个对象添加一些额外的功能,就增加功能来说,装饰模式比生成子类更为灵活。

               装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。

               装饰模式是创建一个包装对象,也就是使用装饰来包裹真实的对象。   

             

   2.装饰模式的实现方式

                    1. 装饰对象和真实对象有相同的接口/抽象类。

                    2. 装饰对象包含一个真实对象的引用(reference)

                    3. 装饰对象的所有方法,内部实现都是通过真实对象的引用来调用,然后实现自己的功能

 

               3.适用性

                    1. 需要扩展一个类的功能,或给一个类添加附加职责。

                    2. 当不能采用生成子类来实现,比如final类

 

复制代码
public class Demo01 {
    public static void main(String[] args) {
    /*    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
        BufferedOutputStream bos;
        BufferedReader br;
        BufferedWriter bw;*/
        
        /*GYFStudent stu = new GYFStudent();
        stu.code();*/
        
        GYFStudent stu = new GYFStudent(new UniversityStudent());
        stu.code();
    }
}

//1.接口
interface Person{
    public void code();
}

//2.接口实现类
final class UniversityStudent implements Person{// final修饰的类不能被继承,他想做丁克
    @Override
    public void code() {
        // TODO Auto-generated method stub
        System.out.println("在大学期间学了一点点C语言...");
    }
}
/*class GYFStudent extends UniversityStudent{
    @Override
    public void code() {
        // TODO Auto-generated method stub
        super.code();
        System.out.println("在GYF IT EDU 学习Java语言...");
    }
}*/

class GYFStudent implements Person{
    private UniversityStudent us;
    public GYFStudent(UniversityStudent us){
        this.us = us;
    }    
    //装饰对象的所有方法,内部实现都是通过真实对象的引用来调用,然后实现自己的功能
    @Override
    public void code() {
        us.code();
        System.out.println("在GYF IT EDU 学习Java语言...");
    }    
}
复制代码

 

posted @   expworld  阅读(201)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示