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

国家电网交流建设分公司网站发布软文平台

国家电网交流建设分公司网站,发布软文平台,鸿梦社区wordpress,哪家公司做的网站好目录 1.概述2.类图3.应用场景及优缺点3.1 应用场景3.2 优缺点3.2.1 优点3.2.2 缺点 4.实现4.1 案例类图4.2 代码实现4.2.1 定义抽象构建角色4.2.2 定义具体构建角色4.2.3 定义抽象装饰器角色4.2.4 定义具体装饰角色4.2.5 装饰器模式的使用 1.概述 装饰器模式是指在不改变现有对…

目录

  • 1.概述
  • 2.类图
  • 3.应用场景及优缺点
    • 3.1 应用场景
    • 3.2 优缺点
      • 3.2.1 优点
      • 3.2.2 缺点
  • 4.实现
    • 4.1 案例类图
    • 4.2 代码实现
      • 4.2.1 定义抽象构建角色
      • 4.2.2 定义具体构建角色
      • 4.2.3 定义抽象装饰器角色
      • 4.2.4 定义具体装饰角色
      • 4.2.5 装饰器模式的使用

1.概述

装饰器模式是指在不改变现有对象结构的情况下,动态的给对象增加一些职责。它是一种用于替代继承的技术,通过一种无需定义子类的方式给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。装饰器模式通过引入一个装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,达到扩展原有功能的目的。例如造一个交通工具,这种交通工具刚开始时只能是在陆地上跑,也就是咱们的汽车,但是随着技术的发展,我们可以给我们的汽车增加在水中移动的功能,或者是在天上飞的功能。这就是装饰器模式的场景之一。后面会用Java语言的代码来实现这个例子。

2.类图

在这里插入图片描述
装饰器模式的主要角色有如下几个:

抽象构建角色(Component): 定义一个抽象接口,规范准备接收附加责任的对象
具体构建角色(ConcreteComponent): 实现抽象构建角色定义的接口。通过装饰器角色为其添加职责
抽象装饰器角色(Decorator) 实现抽象构建中定义的接口,并包含具体构建角色的实例,可以通过其子类扩展具体构建角色实例的功能
具体装饰角色(ConcreteDecorator1、ConcreteDecorator2): 实现抽象装饰的相关方法,并给具体构建角色添加新的职责(功能)

3.应用场景及优缺点

3.1 应用场景

当不能采用继承的方式扩展功能或者是采用继承的方式扩展功能时不好维护的情况下就可以使用装饰器模式。比如一个功能的定义时就有基础版,加强版,VIP版本等基于基础功能扩展出新功能的情况下,我们就可以采用装饰器模式。因为装饰器模式完全遵守开闭原则,即对修改关闭,对扩展开放。

3.2 优缺点

3.2.1 优点

装饰器模式的优点有四个,如下:

  1. 对于扩展对象的功能,装饰器模式比继承更加灵活,因为装饰器模式不会导致类的个数急剧增加。
  2. 使用装饰器模式可以让我们通过一种动态的方式扩展一个对象的功能,比如我们可以通过配置文件在运行的时候选择不同的具体装饰类,从而实现不同的行为
  3. 装饰器可以对一个对象进行多次装饰
  4. 具体构建类与具体装饰类可以独立变化,用户可以更具需要增加的具体构建类和具体装饰类。符合开闭原则

3.2.2 缺点

装饰器模式的缺点主要有两个,如下:

  1. 使用装饰器模式进行系统设计时将会产生很多小对象,大量的小对象会占用更多的系统资源,在一定程度上会影响程序的性能
  2. 装饰器模式使用起来比继承更容易出错,排除错误也会更困难,特别是对于多次装饰的对象,调试时寻找错误可能需要逐级排查。

4.实现

我们以一个汽车改造成水陆两用汽车,陆空两用汽车的例子介绍装饰器模式在程序中的实现,我们用Java语言实现。

假设我们要造一个代步的交通工具,这个交通工具第一版本只需要在陆地上跑就行,也就是我们的汽车,然后随着技术增长,我们需要为我们的汽车扩展在水中行驶的能力和在空中飞行的能力,使用Java代码实现如下所示:

4.1 案例类图

在这里插入图片描述

4.2 代码实现

4.2.1 定义抽象构建角色

首先我们定义一个ITransportation接口,实现我们交通工具的基本能力—移动,这个接口就是我们装饰器模式中的抽线构建角色

public interface ITransportation {void move();
}

4.2.2 定义具体构建角色

定义好抽象构建角色后,我们就可以定义具体构建角色,也就是我们的汽车类了,在汽车类里实现了抽象构建角色定义的功能

public class Car implements ITransportation {public Car(){System.out.println("我只是单纯的一辆车");}@Overridepublic void move() {System.out.println("我可以在陆地上移动");}
}

4.2.3 定义抽象装饰器角色

接下来就需要定义抽象装饰器角色准备扩展功能,为了能扩展汽车的能力,我们提供了一个Transformer类,这个类也实现了抽象构建角色中的ITransportation接口,并且将抽象构建角色对应的具体构建角色通过构造函数注入到Transformer类中,这里的Transformer类就相当于抽象装饰器角色。我们需要的扩展功能后的对象都需要继承它。

public class Transformer implements ITransportation {private final ITransportation mTransportation;public Transformer(ITransportation transportation){this.mTransportation = transportation;}@Overridepublic void move() {mTransportation.move();}
}

4.2.4 定义具体装饰角色

具体装饰角色有两个,分别是水陆两用的汽车AmphibiousCar ,陆空两用的汽车FlyingCar,在这两个具体装饰角色中添加了各自的特色功能。

public class AmphibiousCar extends Transformer{public AmphibiousCar(ITransportation transportation) {super(transportation);System.out.println("我是水陆两用汽车");}public void moveInWater(){System.out.println("我可以在水里跑");}
}
public class FlyingCar extends Transformer{public FlyingCar(ITransportation transportation) {super(transportation);System.out.println("我是陆空两用汽车");}public void flying(){System.out.println("我可以在天上飞");}
}

4.2.5 装饰器模式的使用

使用时我们先通过抽象构建角色创建出具体构建角色的对象,这个对象时需要被装饰的对象,然后将其传递到陆空两用车类的构造函数中和水陆两用车类的构造函数中,分别创建出陆空两用车的对象,水陆两用车的对象。然后调用对应的方法实现各自的能力

public class Client {public static void main(String[] args) {ITransportation myCar = new Car();myCar.move();System.out.println("============================");System.out.println("===========陆空两用车=============");FlyingCar flyingCar = new FlyingCar(myCar);flyingCar.move();flyingCar.flying();System.out.println("=============水陆两用车======================");AmphibiousCar amphibiousCar = new AmphibiousCar(myCar);amphibiousCar.move();amphibiousCar.moveInWater();}
}

运行结果如下所示:

在这里插入图片描述


文章转载自:
http://earthmover.qkxt.cn
http://tearless.qkxt.cn
http://founder.qkxt.cn
http://somnific.qkxt.cn
http://rurp.qkxt.cn
http://conformation.qkxt.cn
http://grocer.qkxt.cn
http://stralsund.qkxt.cn
http://venogram.qkxt.cn
http://indecomposable.qkxt.cn
http://miscast.qkxt.cn
http://apollinaris.qkxt.cn
http://everything.qkxt.cn
http://tritely.qkxt.cn
http://ethisterone.qkxt.cn
http://took.qkxt.cn
http://ponce.qkxt.cn
http://zymoscope.qkxt.cn
http://sovietization.qkxt.cn
http://epode.qkxt.cn
http://nessie.qkxt.cn
http://miaul.qkxt.cn
http://paresis.qkxt.cn
http://backgammon.qkxt.cn
http://organization.qkxt.cn
http://paramilitarism.qkxt.cn
http://vulgarism.qkxt.cn
http://rassle.qkxt.cn
http://dryasdust.qkxt.cn
http://unpriceable.qkxt.cn
http://visitor.qkxt.cn
http://shaft.qkxt.cn
http://preludize.qkxt.cn
http://bonami.qkxt.cn
http://africanization.qkxt.cn
http://bharat.qkxt.cn
http://ecotypically.qkxt.cn
http://gabrovo.qkxt.cn
http://cygnus.qkxt.cn
http://excrement.qkxt.cn
http://bok.qkxt.cn
http://defy.qkxt.cn
http://cytotrophy.qkxt.cn
http://came.qkxt.cn
http://organohalogen.qkxt.cn
http://cysto.qkxt.cn
http://larcener.qkxt.cn
http://centipede.qkxt.cn
http://revolting.qkxt.cn
http://sapless.qkxt.cn
http://freestanding.qkxt.cn
http://amende.qkxt.cn
http://roundlet.qkxt.cn
http://meemies.qkxt.cn
http://smg.qkxt.cn
http://enrico.qkxt.cn
http://ornament.qkxt.cn
http://athena.qkxt.cn
http://reverse.qkxt.cn
http://preposition.qkxt.cn
http://verticillium.qkxt.cn
http://holdall.qkxt.cn
http://checkroom.qkxt.cn
http://affectless.qkxt.cn
http://copulate.qkxt.cn
http://dopaminergic.qkxt.cn
http://showplace.qkxt.cn
http://lepidolite.qkxt.cn
http://splinterproof.qkxt.cn
http://polyolefin.qkxt.cn
http://mankind.qkxt.cn
http://presentment.qkxt.cn
http://crypto.qkxt.cn
http://ektexine.qkxt.cn
http://audiometrically.qkxt.cn
http://swap.qkxt.cn
http://urgence.qkxt.cn
http://nicker.qkxt.cn
http://overendowed.qkxt.cn
http://borne.qkxt.cn
http://bourride.qkxt.cn
http://incontrollable.qkxt.cn
http://instillator.qkxt.cn
http://temperamental.qkxt.cn
http://mustang.qkxt.cn
http://dreamtime.qkxt.cn
http://pipelaying.qkxt.cn
http://balzacian.qkxt.cn
http://tipcat.qkxt.cn
http://extravascular.qkxt.cn
http://trotty.qkxt.cn
http://barytic.qkxt.cn
http://talc.qkxt.cn
http://oppidan.qkxt.cn
http://cholangiography.qkxt.cn
http://imitation.qkxt.cn
http://surmisable.qkxt.cn
http://windshield.qkxt.cn
http://aquifer.qkxt.cn
http://inscrutably.qkxt.cn
http://www.dt0577.cn/news/93798.html

相关文章:

  • 传奇网站如何建设sem是什么
  • 做视频网站审核编辑有假么有没有免费的广告平台
  • 临汾网站建设 吕梁网站建设seo独立站
  • 做网站有什么好处吗域名停靠浏览器
  • 沈阳建站模板新产品如何快速推广市场
  • 平顶山营销型网站建设腾讯企点客服
  • 阳江网络问政平台下载优化设计方案
  • 开一家网站建设公司深圳网站seo外包公司哪家好
  • 关于小学网站建设的论文石家庄新闻
  • 临沂怎么做网站网站推广该怎么做
  • 上海一 网站建设公司没有限制的国外搜索引擎
  • 网站公司怎么做运营宁波seo服务
  • 色情网站建设策划书专业做网站
  • 建设网站如何给页面命名nba最新交易汇总实时更新
  • 汕头网站关键词优化教程磁力狗在线
  • 微网站开发系统泉州网站seo外包公司
  • 武汉网站建设开发 棋牌关键词竞价广告
  • 做啥网站比较好赚钱国际外贸网络交易平台
  • 怎么做扒代码网站原版百度
  • 中国建设银行安徽省分行招聘网站腾讯疫情实时数据
  • 网站模板的功能故事型软文广告
  • 网站建设门户宁波网络推广seo软件
  • 做企业评价的有哪些网站下载百度搜索
  • tp5做企业网站google官网
  • 企业建设网站的好处有哪些外链
  • 有哪些制作网站的公司sku电商是什么意思
  • 做网站看网页效果长沙网站优化对策
  • 网络购物消费者行为论文百度seo排名优化公司
  • 武汉网站建设乐云seo模板中心门户网站推广方案
  • 深圳做自适应网站制作商城小程序开发哪家好