设计模式之装饰模式

装饰模式:动态地给一个对象增加一些额外的职责。就扩张功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案

假设有一个接口Human,一个接口的实现类Man。人类Human是可以跑步的,但是不能飞

如果想给人类加上飞翔的翅膀,可以有三种解决方案:

1、修改实现类Man的方法,但不符合开闭原则
2、给实现类Man添加一个子类,扩展一个人类可以飞的功能。问题在于,如果又想给人类增加猎豹般奔跑的速度,需要继续扩展一个子类。显然,使用继承的方式去扩展一个类的功能,会增加类的层级,类的臃肿会加大维护的成本。
3、使用装饰模式扩展一个类的功能。好处在于,如果继承关系是纵向的,那么装饰类则是某个类横向的扩展,并不会影响继承链上的其他类。例如:C extends B , B extends A,如果需要扩展B的功能,可以设计一个B的装饰类,它并不会影响B的子类C。如果采用在B里面增加方法,势必会使B的所有子类结构被改变

二,装饰模式

基本步骤:

  • 定义一个抽象类或者接口Human
  • 定义一个被装饰的类Man
  • 定义一个装饰的抽象类,内部持有被装饰类的引用
  • 定义一个装饰的实现类

定义一个抽象类Human,代码如下

public abstract class Human {
    public abstract void run();
}

定义一个被装饰的类Man,代码如下

public class Man extends Human{
    @Override
    public void run() {
        System.out.println("人会跑");        
    }
}

定义一个装饰的抽象类,代码如下

public class AbstractDecorator extends Human{

    //持有被装饰类的引用 
    protected Human human;
    //构造函数注入被装饰者
    public AbstractDecorator(Human human) {
            this.human = human;
        }

    @Override
    public void run() {
        human.run();
    }    
}

定义第一个装饰的实现类,代码如下

public class Man1Decorator extends AbstractDecorator{
    public Man1Decorator(Human human) {
        //调用父类的构造方法
        super(human);        
    }
    
    //装饰类增加的功能
        private void fly() {
            System.out.println("人可以飞");
        }

        //增强了功能的run方法
        @Override
        public void run() {
            super.run();
            fly();
        }
}

定义第二个装饰的实现类,代码如下

public class Man2Decorator extends AbstractDecorator{
    public Man2Decorator(Human human) {
        super(human);        
    }
         //装饰类增加的功能
            private void eat() {
                System.out.println("人可以吃");
            }

            //增强了功能的run方法
            @Override
            public void run() {
                super.run();
                eat();
            }
}

测试代码如下:

public class Test {
    public static void main(String[] args) {
    /**     //创建被装饰的类
        Human human = new Man();    
        Man1Decorator man1Decorator= new Man1Decorator(human);
        //创建装饰的类,并添加被装饰类的引用
        Human superMan= new Man2Decorator(man1Decorator);                          
         //执行增强后的run方法
         superMan.run();**/
         
        //创建装饰的类,并添加被装饰类的引用
        Human superMan = new Man2Decorator(new Man1Decorator(new Man()));        
        //执行增强后的run方法
        superMan.run();        
        
    }
}

三,使用场景,及优缺点

使用场景

  • 替代继承,扩展一个类的功能
  • 动态的给一个对象添加功能,以及动态的撤销该功能

优点

  • 动态扩展一个实现类的功能,在不需要添加功能的时候,可以撤销装饰。
  • 装饰类和被装饰类模块间,通过抽象产生依赖,不会相互耦合
  • 对于扩张一个对象的功能,装饰模式比继承模式更加灵活,不会导致类的数量急剧增加

缺点:

  • 在使用装饰模式的时候进行系统设计时会产生很多小对象,这些对象的区别在于他们之间相互连接的方式有所不同,而不是他们的类或者属性值有所不同,大量小对象势必产生一大部分的系统资源开销。影响系统性能
  • 装饰模式是一种比继承更加灵活的解决方案。但同时,也意味着比继承更加容易出错,更加难排长。对于多层装饰的对象,需要逐级排查,较为繁琐

 

四,装饰模式与代理模式的区别

装饰模式:侧重给一个实现类动态添加功能,不会对实现类的方法进行过滤拦截

代理模式:侧重将一个实现类的功能,委托给代理类来处理,可以对实现类的方法进行过滤拦截(某种情况下,可能不执行实现类的方法)

--------------------- 

详见请查看博主原文
来源:优快云 
原文:https://blog.youkuaiyun.com/pihailailou/article/details/82813374 
版权声明:本文为博主原创文章,转载请附上博文链接!

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值