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

360建站和凡科哪个好网站的安全怎么做

360建站和凡科哪个好,网站的安全怎么做,百度手游app下载,羽毛球赛事级别分类装饰器模式装饰器模式又称为包装(Wrapper)模式。装饰器模式以多客户端透明的方式扩展对象的功能#xff0c;是继承关系的一个替代方案。装饰器模式的结构通常给对象添加功能#xff0c;要么直接修改对象添加相应的功能#xff0c;要么派生子类来扩展#xff0c;抑或是使用对…装饰器模式装饰器模式又称为包装(Wrapper)模式。装饰器模式以多客户端透明的方式扩展对象的功能是继承关系的一个替代方案。装饰器模式的结构通常给对象添加功能要么直接修改对象添加相应的功能要么派生子类来扩展抑或是使用对象组合的方式。显然直接修改对应的类的方式并不可取在面向对象的设计中我们应该尽量使用组合对象而不是继承对象来扩展和复用功能装饰器模式就是基于对象组合的方式的。装饰器模式以对客户端透明的方式动态地给一个对象附加上了更多的责任。换言之客户端并不会角色对象在装饰前和装饰后有什么不同。装饰器模式可以在不用创建更多子类的情况下将对象的功能加以扩展。装饰器模式中的角色有1、抽象构件角色给出一个抽象接口以规范准备接受附加责任的对象2、具体构件角色定义一个将要接受附加责任的类3、装饰角色持有一个构建对象的实例并定义一个与抽象构件接口一致的接口4、具体装饰角色负责给构建对象贴上附加的责任装饰器模式的例子现在有这么一个场景1、有一批厨师简单点吧就全是中国厨师他们有一个共同的动作是做晚饭2、这批厨师做晚饭前的习惯不同有些人喜欢做晚饭前洗手、有些人喜欢做晚饭前洗头那么按照装饰器模式先抽象出抽象构建角色Cook接口public interfaceCook {public voidcookDinner();}具体构建角色中国厨师public class ChineseCook implementsCook {Overridepublic voidcookDinner() {System.out.println(中国人做晚饭);}}定义一个装饰器角色具体的工作具体装饰器去实现这样比如美国厨师做晚饭前也先洗手或者先洗头这两个动作就可以做到复用装饰器角色定义为FilterCook很简单实现Cook接口并持有Cook的引用public abstract class FilterCook implementsCook {protectedCook cook;}最后定义一个具体装饰角色该洗手的洗手该洗头的洗头public class WashHandsCook extendsFilterCook {publicWashHandsCook(Cook cook) {this.cook cook;}Overridepublic voidcookDinner() {System.out.println(先洗手);cook.cookDinner();}}public class WashHearCook extendsFilterCook {publicWashHearCook(Cook cook) {this.cook cook;}Overridepublic voidcookDinner() {System.out.println(先洗头);cook.cookDinner();}}调用方这么实现Testpublic voidtestDecorate() {Cook cook0 new WashHandsCook(newChineseCook());Cook cook1 new WashHearCook(newChineseCook());cook0.cookDinner();cook1.cookDinner();}运行结果为先洗手中国人做饭先洗头中国人做饭简单的一个例子实现了装饰器模式的两个功能点客户端只定义了Cook接口并不关心具体实现给Chinese增加上了洗头和洗手的动作且洗头和洗手的动作可以给其他国家的厨师类复用这就是装饰器模式。装饰器模式与Java字节输入流InputStream上面的例子可能写得不是很清楚因此这里再继续用代码示例讲解装饰器模式。装饰器模式在Java体系中的经典应用是Java I/O下面先讲解字节输入流InputStream再讲解字符输入流Reader希望可以通过这两种输入流的讲解加深对于装饰器模式的理解。首先看一下字节输入流InputStream的类结构体系InputStream是一个顶层的接口文章开头就说装饰器模式是继承关系的一种替代方案看一下为什么InputStream假设这里写了两个实现类FileInputStreamObjectInputStream分别表示文件字节输入流对象字节输入流现在我要给这两个输入流加入一点缓冲功能以提高输入流效率使用继承的方式那么就写一个BufferedInputStream继承FileInputStreamObjectInputStream给它们加功能现在我有另外一个需求需要给这两个输入流加入一点网络功能那么就写一个SocketInputStream继承继承FileInputStreamObjectInputStream给它们加功能这样就导致两个问题因为我要给哪个类加功能就必须继承它比如我要给FileInputStreamObjectInputStream加上缓冲功能、网络功能就得扩展出2*24个类更多的以此类推这样势必导致类数量不断膨胀代码无法复用给FileInputStreamObjectInputStream加入缓冲功能本身代码应该是一样的现在却必须继承完毕后把一样的代码重写一遍多此一举代码修改的时候必须修改多个地方可维护性很差所以这个的时候我们就想到了一种解决方案在要扩展的类比如BufferedInputStream中持有一个InputStream的引用在BufferedInputStream调用InputStream中的方法这样扩展的代码就可以复用起来将BufferedInputStream作为InputStream的子类这样客户端只知道我用的是InputStream而不需要关心具体实现可以在客户端不知情的情况下扩展InputStream的功能加上缓冲功能这就是装饰器模式简单的由来一切都是为了解决实际问题而诞生。下一步根据UML图我们来划分一下装饰器模式的角色。1、InputStream是一个抽象构件角色public abstract class InputStream implementsCloseable {//SKIP_BUFFER_SIZE is used to determine the size of skipBufferprivate static final int SKIP_BUFFER_SIZE 2048;//skipBuffer is initialized in skip(long), if needed.private static byte[] skipBuffer;...}2、ByteArrayInputStream、FileInputStream、ObjectInputStream、PipedInputStream都是具体构建角色比如FileInputStream它的声明是publicclass FileInputStream extendsInputStream{/*File Descriptor - handle to the open file*/privateFileDescriptor fd;private FileChannel channel null;...}3、FilterInputStream无疑就是一个装饰角色因为FilterInputStream实现了InputStream内的所有抽象方法并且持有一个InputStream的引用publicclass FilterInputStream extendsInputStream {/*** The input stream to be filtered.*/protected volatileInputStream in;...}4、具体装饰角色就是InflaterInputStream、BufferedInputStream、DataInputStream比如BufferedInputStream的声明就是publicclass BufferedInputStream extendsFilterInputStream {private static int defaultBufferSize 8192;/*** The internal buffer array where the data is stored. When necessary,* it may be replaced by another array of* a different size.*/protected volatile bytebuf[];...}搞清楚具体角色之后我们就可以这么写了public static void main(String[] args) throwsException{File file new File(D:/aaa.txt);InputStream in0 newFileInputStream(file);InputStream in1 new BufferedInputStream(newFileInputStream(file));InputStream in2 new DataInputStream(new BufferedInputStream(newFileInputStream(file)));}我们这里实例化出了三个InputStream的实现类in0这个引用指向的是new出来的FileInputStream这里简单构造出了一个文件字节输入流in1这个引用指向的是new出来的BufferedInputStream它给FileInputStream增加了缓冲功能使得FileInputStream读取文件的内容保存在内存中以提高读取的功能in2这个引用指向的是new出来的DataInputStream它也给FileInputStream增加了功能因为它有DataInputStream和BufferedInputStream两个附加的功能同理我要给ByteArrayInputStream、ObjectInputStream增加功能也可以使用类似的方法整个过程中最重要的是要理解几个问题哪些是具体构建角色、哪些是具体装饰角色尤其是后者区分的关键就是角色中是否持有顶层接口的引用每个具体装饰角色有什么作用因为只有知道每个具体装饰角色有什么作用后才可以知道要装饰某个功能需要用哪个具体装饰角色使用构造方法的方式将类进行组合给具体构建角色加入新的功能装饰器模式与Java字符输入流Reader看完了上面的解读相信大家对于装饰器模式应当有了一定的理解那么再来看一下Java字符输入流Reader来加深对于装饰器模式的印象。简单看一下Reader的类体系结构根据UML分析一下每个角色1、抽象构建角色毫无疑问由Reader来扮演它是一个抽象类没有具体功能2、具体构建角色由InputStreamReader、CharArrayReader、PipedReader、StringReader来扮演3、装饰角色由FilterReader来扮演但是这里要提一下这个BufferedReader它本身也可以作为装饰角色出现看一下BufferedReader的继承关系public class BufferedReader extendsReader {privateReader in;private charcb[];private intnChars, nextChar;private static final int INVALIDATED -2;private static final int UNMARKED -1;private int markedChar UNMARKED;...}看到BufferedReader是Reader的子类且持有Reader的引用因此这里的BufferedReader是可以被认为是一个装饰角色的。4、具体装饰角色BufferedReader上面提到了扮演了装饰角色但是也可以被认为是一个具体装饰角色。除了BufferedReader具体装饰角色还有PushbackReader。FileReader尽管也在第三行但是FileReader构不成一个具体装饰角色因为它不是BufferedReader的子类也不是FilterReader的子类不持有Reader的引用。半透明装饰器模式与全透明装饰器模式再说一下半透明装饰器模式与全透明装饰器模式它们的区别是对于半透明装饰器模式装饰后的类未必有和抽象构件角色同样的接口方法它可以有自己扩展的方法对于全透明装饰器模式装饰后的类有着和抽象构件角色同样的接口方法全透明装饰器模式是一种比较理想主义的想法现实中不太可能出现。比如BufferedInputStream吧我把FileInputStream装饰为BufferedInputStream难道BufferedInputStream就完全没有自己的行为比如返回缓冲区的大小、清空缓冲区(这里只是举个例子实际BufferedInputStream是没有这两个动作的)这些都是InputStream本身不具备的因为InputStream根本不知道缓冲区这个概念它只知道定义读数据相关方法。所以更多的我们是采用半透明的装饰器模式即允许装饰后的类中有属于自己的方法因此前面的I/O代码示例可以这么改动public static void main(String[] args) throwsException{File file new File(D:/aaa.txt);FileInputStream in0 newFileInputStream(file);BufferedInputStream in1 new BufferedInputStream(newFileInputStream(file));DataInputStream in2 new DataInputStream(new BufferedInputStream(newFileInputStream(file)));}这样才更有现实意义。装饰器模式的优缺点优点1、装饰器模式与继承关系的目的都是要扩展对象的功能但是装饰器模式可以提供比继承更多的灵活性。装饰器模式允许系统动态决定贴上一个需要的装饰或者除掉一个不需要的装饰。继承关系是不同继承关系是静态的它在系统运行前就决定了2、通过使用不同的具体装饰器以及这些装饰类的排列组合设计师可以创造出很多不同的行为组合缺点由于使用装饰器模式可以比使用继承关系需要较少数目的类。使用较少的类当然使设计比较易于进行。但是另一方面由于使用装饰器模式会产生比使用继承关系更多的对象更多的对象会使得查错变得困难特别是这些对象看上去都很像。装饰器模式和适配器模式的区别其实适配器模式也是一种包装(Wrapper)模式它们看似都是起到包装一个类或对象的作用但是它们使用的目的非常不一样1、适配器模式的意义是要将一个接口转变成另外一个接口它的目的是通过改变接口来达到重复使用的目的2、装饰器模式不要改变被装饰对象的接口而是恰恰要保持原有的借口哦但是增强原有接口的功能或者改变元有对象的处理方法而提升性能所以这两种设计模式的目的是不同的。
http://wiki.neutronadmin.com/news/114387/

相关文章:

  • 网站建设 创业网站建设投标书范本
  • 旅游网站开发系统分析app开发的价值
  • 手机登录网站后台网络营销托管服务商指的是
  • 怎样在工商局网站做公示深圳网络设计公司
  • 哪个网站可以做自己的网页刷粉网站推广快点
  • 图书管理系统网站开发个人律师网站模板
  • 深圳做网站哪里好php免费网站系统
  • 网站如何减少404跳转wordpress镜像配置
  • 黄骅港信息贴吧小说网站如何做seo关键词
  • 如何用txt做网站时增加照片网站代码需要注意什么问题吗
  • 佛山网站制作哪家好躺平设计家官网
  • 怎样在建立公司网站淄博营销网站建设服务
  • 网站建设与维护中职淄博seo定制
  • icp备案网站管理员有负责吗惠州网站建设技术外包
  • 电影微网站开发京东网址
  • 莆田免费建站模板微信推广引流方法
  • 网站推广营销怎么做软件界面设计工具免费
  • 澄迈网站新闻建设专做农产品的网站有哪些
  • 针对网站做的推广方案建设银行网站能买手机
  • 穷游网站 做行程 封面电子商城网站建设参考文献
  • 文件包上传的网站怎么做雅安市政建设公司网站
  • 免费精品网站模板哪些网站做婚纱摄影
  • 做可动模型的网站鹿泉外贸网站建设
  • 商务网站设计与制作网站做好了怎么做后台管理
  • 身无分文一天赚2000seo单页快速排名
  • 莱芜市网站建设公司微信上浏览自己做的网站
  • 做互联网网站赚钱吗手机网站有什么要求
  • 建设局网站查询小米路由器3 做网站
  • 网站是否wordpress广东十大网站建设品牌
  • 素材最多的网站推荐做素菜的网站