设计模式——(8)装饰者模式

本文探讨了装饰模式的概念,通过UML类图展示如何使用装饰器类来为具体构件类添加功能,同时对比了继承模式的灵活性。实例中展示了如何在别墅类上动态添加颜色和车库功能。装饰模式的优点和缺点,以及适用于的功能扩展场景被详细阐述。
摘要由CSDN通过智能技术生成

1、定义

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

就像在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。

2、UML类图

  • Component(抽象构建):它是具体构建类和抽象装饰类的父类。声明具体构建类的业务方法,它可以使客户端同等的对待被装饰类修饰过的类和没被修饰过的类。实现客户端的透明操作。

  • ConcreteComponent(具体构件类):它实现了抽象构建类的业务方法,装饰类会给它增加额外的方法。

  • Decorator(装饰类):它也是抽象构建类的子类,用于给具体构建类添加方法。它维护一个指向抽象构建对象的引用,通过该引用可以调用装饰之前构建对象的方法,并通过其子类扩展该方法,已达到装饰的目的。

  • ConcreteDecorator(具体装饰类):它是抽象装饰类的子类,负责给构建类添加新的方法。每一个具体的装饰类都定义了一个具体的行为。

3、实例

步骤一:创建抽象的房子类

public abstract class House {
     public abstract String getHouse();
     public abstract String color();
     public abstract String car();
}

步骤二:创建实体房子类,实体房子继承抽象房子

public class villa extends House{
     @Override
     public String getHouse() {
           System.out.println("抽象构建类:购买房子");
           return "具体构件类:买了別墅\n";
     }
     @Override
     public String color() {
           // TODO Auto-generated method stub
           return "白色";
     }
     @Override
     public String car() {
           // TODO Auto-generated method stub
           return "别克";
     }
}

步骤三:创建抽象装饰父类

public class Decorator extends House{
     private House dec;
     public Decorator(House dec) {
           // TODO Auto-generated constructor stub
           this.dec = dec;
     }
     @Override
     public String getHouse() {
           // TODO Auto-generated method stub
           return this.dec.getHouse();
     }
     @Override
     public String color() {
           // TODO Auto-generated method stub
           return this.dec.color();
     }
     @Override
     public String car() {
           // TODO Auto-generated method stub
           return this.dec.car();
     }
}

步骤四:创建具体装饰子类

public class colorDecorator extends Decorator{
     public colorDecorator(House dec) {
           super(dec);
     }
     public String getHouse() {
           return super.getHouse()+"具体装饰类1:粉刷墙面 "+super.color()+"\n";
     }
}

public class garageDecorator extends Decorator{
     public garageDecorator(House dec) {
           super(dec);
     }
     public String getHouse() {
           return super.getHouse()+"具体装饰类2:增加车库 "+super.car();
     }
}

测试类

public class Client {
     public static void main(String[] args) {
           House dec;
           dec = new villa();
           dec = new colorDecorator(dec);
           dec = new garageDecorator(dec);
           System.out.println(dec.getHouse());
     }
}

4、优点

  • 对于扩张一个对象的功能,装饰模式比继承模式更加灵活,不会导致类的数量急剧增加。

  • 可以通过一种动态的方式扩张一个类的功能,同过配置文件可以在运行时济宁选择,不同的装饰类。

  • 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合可以创造不同的行为的组合。

5、缺点

  • 在使用装饰模式的时候进行系统设计时会产生很多小对象,这些对象的区别在于他们之间相互连接的方式有所不同,而不是他们的类或者属性值有所不同,大量小对象势必产生一大部分的系统资源开销。影响系统性能。

  • 装饰模式是一种比继承更加灵活的解决方案。但同时,也意味着比继承更加容易出错,更加难排长。对于多层装饰的对象,需要逐级排查,较为繁琐。

6、使用场景

  • 在不影响其他对象的情况下以动态的,透明的方式给单个对象添加职责。

  • 不能用继承进行扩张的时候。

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DF10F-0001A

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

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

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

打赏作者

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

抵扣说明:

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

余额充值