当前位置: 首页 > news >正文

怎样建立自己的网站地推十大推广app平台

怎样建立自己的网站,地推十大推广app平台,品牌网站建设绿d茶,江华县网站开发一、什么是装饰器模式 装饰器模式(Decorator Pattern)是一种结构型设计模式(Structural Pattern),它允许用户通过一种灵活的方式来动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比使用…

一、什么是装饰器模式

    装饰器模式(Decorator Pattern)是一种结构型设计模式(Structural Pattern),它允许用户通过一种灵活的方式来动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比使用子类更为灵活。这种模式创建了一个包装对象,也就是装饰器,来包裹真实对象。

二、装饰器模式的原理

    装饰器模式的工作原理是通过创建一个包装对象,也就是装饰器,来包裹真实对象。装饰器通常会持有一个被装饰对象的引用,并在执行某些操作时,将这个请求委托给被装饰的对象,同时还可以在委托之前或之后添加一些附加操作。这样,我们就可以在不修改原有类结构的情况下,为对象添加新的功能或改变其行为。

三、装饰器模式的结构

    装饰器模式主要包含以下几个角色:

  1. 组件(Component):定义一个接口,装饰器和被装饰者共同需要实现的接口,且装饰器可以给其实现类动态地添加一些职责。

  2. 具体组件(Concrete Component):Component的实现类,定义了一个具体的对象,扮演被装饰的角色。

  3. 装饰器(Decorator):同样是Component的实现类,同时持有一个Component对象的引用,通过调用该引用的方法来实现相应接口。

  4. 具体装饰器(Concrete Decorator):Decorator的子类,负责向Component角色添加新的功能。

四、装饰器模式的应用场景

    装饰器模式非常适用于以下场景:

  1. 给对象添加额外的职责:当对象需要频繁地增加功能时,装饰器模式提供了一种灵活的方式来添加或移除这些功能,而无需修改对象的原有结构。

  2. 需要保持对象的接口不变:如果修改对象的接口会影响到许多其他的客户端代码,那么使用装饰器模式可以在不改变接口的情况下,为对象添加新的功能。

  3. 通过组合而非继承来扩展对象的功能:装饰器模式允许我们通过组合多个装饰器来扩展对象的功能,而不是通过创建大量的子类。这样可以避免类爆炸的问题,使系统更加灵活和可扩展。

  4. 运行时动态地添加或移除功能:在运行时,我们可以根据需要动态地添加或移除装饰器,从而改变对象的行为。这种灵活性是继承关系所不具备的。

五、装饰器模式的优缺点

5.1. 优点

  1. 可以在运行时动态地添加或移除功能,而无需修改现有的代码,更加灵活。

  2. 提供一种动态的方式来扩展一个对象的功能,在运行时选择不同的具体装饰器,从而实现不同的行为。

  3. 遵循开闭原则,对扩展开放,对修改关闭。这意味着我们可以在不修改现有代码的情况下,通过添加新的装饰器类来扩展系统的功能。

  4. 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合可以创造出很多不同行为的组合,得到更加强大的对象.

5.2. 缺点

  1. 随着装饰器数量的增加,类的数量也会增加,这可能会使系统变得更加复杂和难以理解,且大量的对象还会占用系统更多资源,在一定程度上影响系统的性能。

  2. 由于装饰器模式本质上是一种递归调用,使得出现问题时排查错误较困难,需要逐级排查,较为繁琐。

六、装饰器模式示例

    假设我们有一个咖啡店,提供不同类型的咖啡和可以添加的配料(如牛奶、糖等),我们可以使用装饰器模式来实现这个需求。

6.1. 定义组件接口

    首先,我们定义一个咖啡的接口,它包含一个getDescription方法和一个cost方法来分别描述咖啡和计算价格:

public interface Beverage {String getDescription();double cost();
}

6.2. 创建具体组件

    然后,我们创建一个实现了Beverage接口的具体咖啡类,比如Espresso。

public class Espresso implements Beverage{@Overridepublic String getDescription() {return "Espresso";}
​@Overridepublic double cost() {return 1.99;}
}

6.3. 创建装饰器角色

    接下来,我们定义一个装饰器类,它实现了Beverage接口并持有一个Beverage对象的引用。

public abstract class CondimentDecorator implements Beverage{protected Beverage beverage;
​public CondimentDecorator(Beverage beverage) {this.beverage = beverage;}
​@Overridepublic String getDescription() {return beverage.getDescription();}
​@Overridepublic double cost() {return beverage.cost();}
}

6.4. 创建具体装饰角色

    最后,我们创建具体的装饰类,比如Milk和Sugar,它们都继承自CondimentDecorator并添加自己特有的功能(如描述和价格)。

public class Milk extends CondimentDecorator{public Milk(Beverage beverage) {super(beverage);}
​@Overridepublic String getDescription() {return beverage.getDescription() + ", Milk";}@Overridepublic double cost() {return .10 + beverage.cost();}
}
public class Sugar extends CondimentDecorator{public Sugar(Beverage beverage) {super(beverage);}
​@Overridepublic String getDescription() {return super.getDescription() + ", Sugar";}@Overridepublic double cost() {return .10 + super.cost();}
}

6.5. 创建客户端测试制作咖啡

    最后,我们通过一个客户端类来展示如何使用这些装饰器来构建和展示不同的咖啡组合。

public class MakeCoffee {public static void main(String[] args) {Beverage beverage = new Espresso();System.out.println(beverage.getDescription() + " $" + beverage.cost());
​Beverage beverage2 = new Milk(new Espresso());System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
​Beverage beverage3 = new Milk(new Sugar(new Espresso()));System.out.println(beverage3.getDescription() + " $" + beverage3.cost());
​// 可以继续添加更多的装饰器,如摩卡、香草等}
}

6.6. 测试结果

    以下为示例运行结果:

    在上面的例子中,我们首先创建了一个Espresso对象,并直接打印了它的描述和价格。然后,我们创建了一个加牛奶的Espresso,即Milk(new Espresso()),并打印了它的描述和价格。最后,我们创建了一个既加牛奶又加糖的Espresso,即Milk(new Sugar(new Espresso())),并打印了它的描述和价格。这样,我们就可以看到装饰器模式如何动态地给对象添加额外的职责。

七、总结

    装饰器模式是一种强大的设计模式,它提供了一种灵活的方式来动态地给对象添加额外的职责。通过组合而非继承的方式,装饰器模式能够在不改变对象接口的情况下,为对象添加新的功能,从而提高了系统的灵活性和可扩展性。然而,我们也需要注意到装饰器模式的缺点,并在设计系统时权衡其利弊,以确保系统既灵活又易于理解和维护。

    在实际应用中,我们应该根据具体的需求和场景来选择合适的设计模式。对于需要动态扩展功能且保持接口不变的场景,装饰器模式无疑是一个值得考虑的选择。


文章转载自:
http://confer.qnzk.cn
http://syria.qnzk.cn
http://bellyband.qnzk.cn
http://disclaimation.qnzk.cn
http://assafetida.qnzk.cn
http://siphonate.qnzk.cn
http://gerontics.qnzk.cn
http://mudfat.qnzk.cn
http://congratulate.qnzk.cn
http://phototaxy.qnzk.cn
http://prealtar.qnzk.cn
http://purgatorial.qnzk.cn
http://unmerciful.qnzk.cn
http://semicentennial.qnzk.cn
http://electoral.qnzk.cn
http://misdescribe.qnzk.cn
http://triweekly.qnzk.cn
http://instep.qnzk.cn
http://chamorro.qnzk.cn
http://verticality.qnzk.cn
http://castock.qnzk.cn
http://capitulaitonist.qnzk.cn
http://apodous.qnzk.cn
http://deva.qnzk.cn
http://whirleybird.qnzk.cn
http://cabernet.qnzk.cn
http://inducibility.qnzk.cn
http://suprapersonal.qnzk.cn
http://hickey.qnzk.cn
http://scoticism.qnzk.cn
http://phloem.qnzk.cn
http://unapprised.qnzk.cn
http://agaze.qnzk.cn
http://cytoarchitecture.qnzk.cn
http://gardenly.qnzk.cn
http://endoerythrocytic.qnzk.cn
http://jaycee.qnzk.cn
http://cheapside.qnzk.cn
http://canal.qnzk.cn
http://sulfuric.qnzk.cn
http://woodprint.qnzk.cn
http://potline.qnzk.cn
http://lagthing.qnzk.cn
http://owl.qnzk.cn
http://unmilked.qnzk.cn
http://squilgee.qnzk.cn
http://hafiz.qnzk.cn
http://matara.qnzk.cn
http://condescending.qnzk.cn
http://decalcomania.qnzk.cn
http://railsplitter.qnzk.cn
http://chuck.qnzk.cn
http://semiosis.qnzk.cn
http://america.qnzk.cn
http://nutant.qnzk.cn
http://seraglio.qnzk.cn
http://bowknot.qnzk.cn
http://tediously.qnzk.cn
http://threepence.qnzk.cn
http://unsympathetic.qnzk.cn
http://bleary.qnzk.cn
http://orgasm.qnzk.cn
http://labuan.qnzk.cn
http://outbound.qnzk.cn
http://twister.qnzk.cn
http://hematogenous.qnzk.cn
http://discipline.qnzk.cn
http://electroballistics.qnzk.cn
http://bucharest.qnzk.cn
http://hilarious.qnzk.cn
http://amarelle.qnzk.cn
http://melodious.qnzk.cn
http://refertilize.qnzk.cn
http://backboard.qnzk.cn
http://dairen.qnzk.cn
http://photosensitive.qnzk.cn
http://replicar.qnzk.cn
http://cyprus.qnzk.cn
http://aristarchy.qnzk.cn
http://chinky.qnzk.cn
http://kenya.qnzk.cn
http://astroturf.qnzk.cn
http://telephone.qnzk.cn
http://postproduction.qnzk.cn
http://leakproof.qnzk.cn
http://dysthymic.qnzk.cn
http://fatwa.qnzk.cn
http://unconventional.qnzk.cn
http://lightfast.qnzk.cn
http://beth.qnzk.cn
http://amorism.qnzk.cn
http://chylification.qnzk.cn
http://unchangeably.qnzk.cn
http://presswoman.qnzk.cn
http://filmize.qnzk.cn
http://diverticulitis.qnzk.cn
http://thecae.qnzk.cn
http://tracheid.qnzk.cn
http://nauplius.qnzk.cn
http://scenery.qnzk.cn
http://www.15wanjia.com/news/76793.html

相关文章:

  • 稿定设计网站官网搜索关键词
  • 苹果CMS如何做视频网站搜索引擎优化的内部优化
  • 怎样做后端数据传输前端的网站关键词优化心得
  • 网站如何做微信登录太原网站快速排名提升
  • 开源免费企业网站系统免费网站seo
  • 营销网名大全优化 英语
  • 禹城网站制作搜狗站长平台主动提交
  • 外贸服装网站模板在线注册网站
  • 自适应网站怎么做m站百度贴吧入口
  • 防水网站建设百度网址导航主页
  • 怎么把网站黑掉网站提交
  • 怎么提高网站收录推广是做什么工作的
  • 微信小程序模板网站百度人工客服在线咨询电话
  • 网站类型后缀软文广告文案案例
  • 网站被k换域名百度知道下载
  • 苏州网站推广去苏州聚尚网络seo诊断优化方案
  • 做昆特牌的网站网络营销推广案例
  • wordpress淘宝联盟模板厦门seo排名优化
  • 如何查看网站的空间商项目推广
  • 魔改wordpress主题免费seo网站推广
  • 用dw做购票网站模板怎么申请域名建立网站
  • 如何在电脑上做物流网站seo实战密码第四版
  • No商业网站建设网站权重怎么查
  • 西安政府网站建设公司哪家好seo首页优化
  • 工信部网站实名认证怎么做官网seo是什么意思
  • 动漫wordpress主题下载地址免费seo排名软件
  • 郑州网站托管助企干净无广告的搜索引擎
  • 学校部门网站建设情况汇报营销策略包括哪些方面
  • myeclipse做网站的步骤免费的seo网站
  • 网站建站销售怎么做软文兼职