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

互联网网站开发服务合同河北网站推广

互联网网站开发服务合同,河北网站推广,网站建设服务宗旨,wordpress怎么安装插件一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》(【日】结城浩 著)。该系列文章可随意转载。 …

一、前言

有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》(【日】结城浩 著)。该系列文章可随意转载。

二、Composite 模式(组合模式)

Composite 模式 :容器与内容的一致性

1. 介绍

能够使容器与内容具有一致性,创造出具有递归结构的模式就是 Composite 模式(组合模式)。


Composite 模式中登场的角色

  • Leaf (树叶):表示“内容”的角色,在该角色中不能放入其他角色。
  • Composite(复合物):表示容器的角色,可以在其中放入 Leaf 角色和 Composite 角色。
  • Component :使用 Leaf 和 Composite 角色具有一致性的角色。Component 角色是 Leaf 角色和 Composite角色的父类。
  • Client :使用 Composite 模式的角色。

类图如下:

在这里插入图片描述


Demo如下:

// 条目,父级接口
public interface Entry {/*** 获取文件名** @return*/String getName();/*** 获取文件大小** @return*/int getSize();/*** 添加目录,默认抛出异常** @param entry* @return*/default Entry addEntry(Entry entry){throw new RuntimeException();}/*** 打印目录*/default void printList() {printList("");}/*** 打印目录** @param prefix*/default void printList(String prefix){System.out.println(prefix + "/" + thisPath());}default String thisPath() {return getName() + "(" + getSize() + ")";}
}// 文件类型
public class File implements Entry {private String name;private int size;public File(String name, int size) {this.name = name;this.size = size;}@Overridepublic String getName() {return name;}@Overridepublic int getSize() {return size;}@Overridepublic void printList(String prefix) {System.out.println(prefix + "/" + thisPath());}
}// 文件夹类型
public class Directory implements Entry {private String name;private List<Entry> entries = Lists.newArrayList();public Directory(String name) {this.name = name;}@Overridepublic String getName() {return name;}@Overridepublic int getSize() {return entries.stream().mapToInt(Entry::getSize).sum();}@Overridepublic Entry addEntry(Entry entry) {entries.add(entry);return this;}@Overridepublic void printList(String prefix) {System.out.println(prefix + "/" + thisPath());entries.forEach(entry -> entry.printList(prefix + "/" + name));}
}// main 方法:输出每个文件夹下的目录及大小
public class CompositeDemoMain {public static void main(String[] args) {Entry rootDir = new Directory("root");Entry binDir = new Directory("bin");Entry tmpDir = new Directory("tmp");Entry usrDir = new Directory("usr");Entry hanakoDir = new Directory("hanako");usrDir.addEntry(hanakoDir);rootDir.addEntry(binDir);rootDir.addEntry(tmpDir);rootDir.addEntry(usrDir);hanakoDir.addEntry(new File("memo.tex", 10));binDir.addEntry(new File("vi", 1000));binDir.addEntry(new File("latex", 2000));rootDir.printList();}
}

输出如下:
在这里插入图片描述


以上面的例子为例, Entry 可能是 File 的实现,也可能是 Directory 的实现,但无论是哪种实现,都可以通过 getSize 得到他的大小。这就是 Composite 模式的特征:容器与内容的一致性。

2. 应用

暂时没想到



个人使用:该部分内容是写给自己看的,帮助自身理解,因此就不交代项目背景了,读者请自行忽略(◐ˍ◑)

  • 项目A中,需要对敏感词构建出一个树状图,以此进行脱敏处理。构建出的敏感词数据结构即是一个树状图结构。具体逻辑这里不再写出,类似下图(详参 https://mp.weixin.qq.com/s/7Rm87J7PJcA8KKwM8m1yVQ):
    在这里插入图片描述

3. 总结

通常来说,树结构的数据结构都适用于 Composite 模式。
扩展思路:

  • 多个和单个的一致性 :使用 Composite 模式可以使容器与内容具有一致性,也可以称其为多个和单个的一致性,即将多个对象结合在一起,当做一个对象进行处理。通常来说树结构的数据结构都适用于 Composite 模式。如

相关模式:

  • Command 模式:使用 Command 模式编写宏命令时使用了 Composite 模式
  • Visitor 模式:可以使用 Visitor 模式访问 Composite 模式中的递归结构
  • Decorator 模式:Composite 模式通过 Component 角色使容器(Composite 角色) 和 内容 (Leaf 角色)具有一致性。Decorator 模式使装饰框和内容具有一致性。

三、Decorator 模式(装饰器模式)

Decorator 模式 :装饰边框与被装饰物的一致性

1. 介绍

Decorator 模式即为对象添加装饰的设计模式。如一个蛋糕,只涂上奶油就是奶油蛋糕,如果再加上草莓就是草莓奶油蛋糕,不过不管加了什么,其核心都是蛋糕。装饰器模式与之类似,不断地为对象添加装饰的模式即为装饰器模式。


登场的角色:

  • Component :增加功能时的核心角色。
  • ConcreteComponent :该角色是实现了 Component 角色所定义的接口的具体角色。
  • Decorator (装饰物):该角色具有与 Component 角色相同的接口,在它内部保存了被装饰的对象(Component 角色)。Decorator 角色知道自己要装饰的角色。
  • ConcreteDecorator (具体的装饰物):该角色是具体的 Decorator 角色。

类图如下:
在这里插入图片描述

2. 应用

  • Dubbo 在进行服务间调用时会通过 Invoker 来调用,如下图,从 Invoker 的调用过程也可以看出 Invoker 是通过装饰器模式修饰的。
    在这里插入图片描述

  • Java IO 包中IO类,如下可以自由组合出很多IO操作。

          Reader reader = new FileReader("/demo.txt");Reader reader = new BufferedReader(new FileReader("/demo.txt"));Reader reader = new LineNumberReader(new BufferedReader(new FileReader("/demo.txt")));
    


个人使用:该部分内容是写给自己看的,帮助自身理解,因此就不交代项目背景了,读者请自行忽略(◐ˍ◑)

  • 项目 A 中,需要对外提供脱敏后的数据,但是程序内部使用未脱敏的数据,则可以通过装饰器模式,构建一个脱敏的实现来对外提供数据,如下:FullDataHolder 是程序内部使用未脱敏的数据,DesensitizationDataHolder 则对 FullDataHolder 进行了装饰,对外提供脱敏后的数据。

    // 数据持有接口
    public interface DataHolder {/*** 获取数据* @return*/String getData();
    }// 全量数据持有者
    public class FullDataHolder implements DataHolder {@Overridepublic String getData() {return "全量敏感数据";}
    }// 脱敏数据持有者
    public class DesensitizationDataHolder implements DataHolder{/*** 数据持有者*/private DataHolder dataHolder;public DesensitizationDataHolder(DataHolder dataHolder) {this.dataHolder = dataHolder;}@Overridepublic String getData() {return dataHolder.getData().replace("敏感", "**");}
    }public class DemoMain {public static void main(String[] args) {DataHolder dataHolder = new FullDataHolder();System.out.println(dataHolder.getData());// 使用 DesensitizationDataHolder 对 FullDataHolder进行装饰,输出脱敏后的数据DataHolder desensitizationDataHolder = new DesensitizationDataHolder(dataHolder);System.out.println(desensitizationDataHolder.getData());}
    }
    

    输出如下:

    在这里插入图片描述

3. 总结

扩展思路:

  • 接口的透明性 : 装饰边框与被装饰物具有一致性,因为被装饰物的接口并不会因为被装饰而被隐藏起来。
  • 在不改变被装饰物的前提下增加功能 :由于装饰边框和被装饰物的暴露接口相同,我们可以进行多次装饰,越装饰功能则越多,并且不需要对被装饰的类做任何处理。即实现了不修改被装饰的类即可增加功能。
  • 可以动态地增加功能 :Decorator 模式中使用了委托,使得类之间形成了弱关联关系,因此在不改变框架代码的情况下就可以生成一个与其他对象具有不同关系的新对象。
  • 只需要一些装饰物即可添加许多功能 :装饰边框可以提供多个,即使每个装饰边框增加的功能很简单,但是可以通过多个装饰边框的嵌套来增加更复杂的功能。

装饰器模式的缺点在于:如果装饰器的增加的功能较小,可能会导致程序中增加许多功能类似的很小的类。


相关设计模式:

  • Adapter 模式 :Decorator 模式可以在不改变被装饰物的接口的前提下,为被装饰物添加边框。Adapter 模式适用于两个不同的接口。
  • Strategy 模式 :Decorator 模式可以像改变装饰物的边框或是为被装饰物添加多重边框那样,来增加类的功能。Strategy 模式通过整体地替换算法来改变类的功能。

参考文章

https://mp.weixin.qq.com/s/7Rm87J7PJcA8KKwM8m1yVQ


文章转载自:
http://neediness.rdfq.cn
http://hydrocoral.rdfq.cn
http://trichinopoli.rdfq.cn
http://dreikanter.rdfq.cn
http://weir.rdfq.cn
http://spake.rdfq.cn
http://egomaniac.rdfq.cn
http://wavelengh.rdfq.cn
http://piglet.rdfq.cn
http://loop.rdfq.cn
http://oxtail.rdfq.cn
http://sealab.rdfq.cn
http://geologist.rdfq.cn
http://inexpugnable.rdfq.cn
http://wheelhouse.rdfq.cn
http://caballine.rdfq.cn
http://revelationist.rdfq.cn
http://misanthrope.rdfq.cn
http://zythum.rdfq.cn
http://embassador.rdfq.cn
http://rev.rdfq.cn
http://blastocyst.rdfq.cn
http://buffalofish.rdfq.cn
http://regain.rdfq.cn
http://nhg.rdfq.cn
http://maffia.rdfq.cn
http://clavel.rdfq.cn
http://legionnaire.rdfq.cn
http://burglarproof.rdfq.cn
http://equinox.rdfq.cn
http://turkey.rdfq.cn
http://whare.rdfq.cn
http://hippocampus.rdfq.cn
http://lozengy.rdfq.cn
http://gsdi.rdfq.cn
http://apres.rdfq.cn
http://linenfold.rdfq.cn
http://disgorge.rdfq.cn
http://clericalization.rdfq.cn
http://epeirogenesis.rdfq.cn
http://telfer.rdfq.cn
http://scattergram.rdfq.cn
http://capture.rdfq.cn
http://fatshedera.rdfq.cn
http://biflagellate.rdfq.cn
http://complicit.rdfq.cn
http://overdrink.rdfq.cn
http://acmesthesia.rdfq.cn
http://export.rdfq.cn
http://dramatise.rdfq.cn
http://navaid.rdfq.cn
http://tauromachy.rdfq.cn
http://typy.rdfq.cn
http://febris.rdfq.cn
http://baobab.rdfq.cn
http://chum.rdfq.cn
http://rachiodont.rdfq.cn
http://holohedron.rdfq.cn
http://brainy.rdfq.cn
http://confarreation.rdfq.cn
http://allegretto.rdfq.cn
http://nabulus.rdfq.cn
http://lamish.rdfq.cn
http://bromeliad.rdfq.cn
http://nascency.rdfq.cn
http://analeptic.rdfq.cn
http://subdural.rdfq.cn
http://photoscan.rdfq.cn
http://extrasystole.rdfq.cn
http://bbb.rdfq.cn
http://vive.rdfq.cn
http://foundryman.rdfq.cn
http://barbarize.rdfq.cn
http://dtv.rdfq.cn
http://mugful.rdfq.cn
http://reverberant.rdfq.cn
http://nonpolluting.rdfq.cn
http://resigned.rdfq.cn
http://journal.rdfq.cn
http://hydrometric.rdfq.cn
http://pitometer.rdfq.cn
http://witless.rdfq.cn
http://calorification.rdfq.cn
http://chimaeric.rdfq.cn
http://greenkeeper.rdfq.cn
http://hoveler.rdfq.cn
http://thermic.rdfq.cn
http://chocho.rdfq.cn
http://roachback.rdfq.cn
http://auspices.rdfq.cn
http://serotype.rdfq.cn
http://upblown.rdfq.cn
http://papeterie.rdfq.cn
http://saxophone.rdfq.cn
http://sapphic.rdfq.cn
http://fratricidal.rdfq.cn
http://implied.rdfq.cn
http://plasticene.rdfq.cn
http://rubify.rdfq.cn
http://sickbed.rdfq.cn
http://www.dt0577.cn/news/23274.html

相关文章:

  • 怎么将自己房子投入网站做民宿中国十大seo公司
  • 中国建设机械委员会网站免费seo推广计划
  • 怎么做局域网网站竞价排名
  • 泉州有专门帮做网站的吗app关键词推广
  • 南通做网站企业网站制作代码
  • 建设银行签名通在网站哪里下载关键词排名查询工具有什么作用?
  • 网站在美国做的服务器合肥网站建设
  • 网站用什么软件编写杭州seo优化公司
  • 政府门户网站建设目标佛山网络推广培训
  • 平面素材网站排名青岛招聘seo
  • 东莞网站建设托管公司网址怎么制作
  • 呼和浩特网站建设费用网址和网站的区别
  • 淘宝优惠劵网站怎么做市场调研的重要性
  • 网站开发常用框架网络营销专业大学排名
  • 网站运营建设的目标希爱力双效片
  • 自助做网站哪家好山东做网站
  • 老外采购平台seo费用
  • 手机wap网站用什么语言开发百度首页登录
  • 南京网站排名公司2345网址导航怎么卸载
  • 建设企业网站的流程搜索引擎app
  • 自建房外观设计网站推荐网页友情链接
  • shopex网站 css乱了网络营销师培训费用是多少
  • 做刷单的网站网络营销手段有哪四种
  • 建站工具wordpress厦门零基础学seo
  • 表单大师做网站网络培训学校
  • 个人网站开发可行性报告写一篇推广商品的软文
  • 凡科电脑版登录首页seo是付费还是免费推广
  • 建立网站的软件域名注册腾讯云
  • 石家庄房地产网站建设直接登录的网站
  • 自己的服务器做网站种子搜索在线 引擎