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

杭州如何设计网站首页怎么看网站是动态还是静态

杭州如何设计网站首页,怎么看网站是动态还是静态,江苏中高风险地区名单,京东云安装wordpress史上最全 结构型模式之 代理 适配器 装饰者 模式-CSDN博客 5.4 桥接模式 5.4.1 概述 现在有一个需求#xff0c;需要创建不同的图形#xff0c;并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系#xff1a; 我们可以发现有很多的类#xff0c;假…史上最全 结构型模式之 代理 适配器 装饰者 模式-CSDN博客 5.4 桥接模式 5.4.1 概述 现在有一个需求需要创建不同的图形并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系 我们可以发现有很多的类假如我们再增加一个形状或再增加一种颜色就需要创建更多的类。 试想在一个有多种可能会变化的维度 系统中用继承方式会造成类爆炸扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统我们此时可以考虑使用桥接模式。 定义 将抽象与实现分离使它们可以独立变化。它是用组合关系代替继承关系来实现从而降低了抽象和实现这两个可变维度的耦合度。 5.4.2 结构 桥接Bridge模式包含以下主要角色 抽象化Abstraction角色 定义抽象类并包含一个 对实现化对象 的引用。扩展抽象化Refined Abstraction角色 是抽象化角色的子类实现父类中的业务方法并通过组合关系调用实现化角色中的业务方法。实现化Implementor角色 定义实现化角色的接口供扩展抽象化角色调用。具体实现化Concrete Implementor角色 给出实现化角色接口的具体实现。 5.4.3 案例 【例】视频播放器 需要开发一个跨平台视频播放器可以在不同操作系统平台如Windows、Mac、Linux等上播放多种格式的视频文件常见的视频格式包括RMVB、AVI、WMV等。该播放器包含了两个维度适合使用桥接模式。 类图如下 代码如下 //视频文件 public interface VideoFile {void decode(String fileName); }//avi文件 public class AVIFile implements VideoFile {public void decode(String fileName) {System.out.println(avi视频文件 fileName);} }//rmvb文件 public class REVBBFile implements VideoFile {public void decode(String fileName) {System.out.println(rmvb文件 fileName);} }//操作系统版本 public abstract class OperatingSystemVersion {protected VideoFile videoFile;public OperatingSystemVersion(VideoFile videoFile) {this.videoFile videoFile;}public abstract void play(String fileName); }//Windows版本 public class Windows extends OperatingSystem {public Windows(VideoFile videoFile) {super(videoFile);}public void play(String fileName) {videoFile.decode(fileName);} }//mac版本 public class Mac extends OperatingSystemVersion {public Mac(VideoFile videoFile) {super(videoFile);}public void play(String fileName) {videoFile.decode(fileName);} }//测试类 public class Client {public static void main(String[] args) {OperatingSystem os new Windows(new AVIFile());os.play(战狼3);} } 好处 桥接模式提高了系统的可扩充性在两个变化维度中任意扩展一个维度都不需要修改原有系统。 如如果现在还有一种视频文件类型wmv我们只需要再定义一个类实现VideoFile接口即可其他类不需要发生变化。 实现细节对客户透明 坏处 适配器模式容易类爆炸 , 每个维度都要创建多个类 5.4.4 使用场景 当一个类存在两个独立变化的维度且这两个维度都需要进行扩展时。当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。类爆炸当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系通过桥接模式可以使它们在抽象层建立一个关联关系。 装饰是小的包裹大的桥接是大的包裹小的 5.5 外观模式 5.5.1 概述 有些人可能炒过股票但其实大部分人都不太懂这种没有足够了解证券知识的情况下做股票是很容易亏钱的刚开始炒股肯定都会想如果有个懂行的帮帮手就好其实基金就是个好帮手支付宝里就有许多的基金它将投资者分散的资金集中起来交由专业的经理人进行管理投资于股票、债券、外汇等领域而基金投资的收益归持有者所有管理机构收取一定比例的托管管理费用。 定义 又名门面模式是一种通过为多个复杂的子系统提供一个一致的接口而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口基金外部应用程序不用关心内部子系统的具体的细节投资哪些这样会大大降低应用程序的复杂度提高了程序的可维护性。 外观Facade模式是“迪米特法则”的典型应用 5.5.2 结构 外观Facade模式包含以下主要角色 外观Facade角色为多个子系统对外提供一个共同的接口。子系统Sub System角色实现系统的部分功能客户可以通过外观角色访问它。 5.5.3 案例 【例】智能家电控制 小明的爷爷已经60岁了一个人在家生活每次都需要打开灯、打开电视、打开空调睡觉时关闭灯、关闭电视、关闭空调操作起来都比较麻烦。所以小明给爷爷买了智能音箱可以通过语音直接控制这些智能家电的开启和关闭。类图如下 代码如下 //灯类 public class Light {public void on() {System.out.println(打开了灯....);}public void off() {System.out.println(关闭了灯....);} }//电视类 public class TV {public void on() {System.out.println(打开了电视....);}public void off() {System.out.println(关闭了电视....);} }//控制类 public class AirCondition {public void on() {System.out.println(打开了空调....);}public void off() {System.out.println(关闭了空调....);} }//智能音箱 外观类 和用户交互 public class SmartAppliancesFacade {//聚合三个电器private Light light;private TV tv;private AirCondition airCondition;public SmartAppliancesFacade() {light new Light();tv new TV();airCondition new AirCondition();}public void say(String message) {if(message.contains(打开)) {on();} else if(message.contains(关闭)) {off();} else {System.out.println(我还听不懂你说的);}}//起床后一键开电器private void on() {System.out.println(起床了);light.on();tv.on();airCondition.on();}//睡觉一键关电器private void off() {System.out.println(睡觉了);light.off();tv.off();airCondition.off();} }//测试类 public class Client {public static void main(String[] args) {//创建外观对象SmartAppliancesFacade facade new SmartAppliancesFacade();//客户端直接与外观对象进行交互facade.say(打开家电);facade.say(关闭家电);} } 好处 降低了子系统与客户端之间的耦合度使得子系统的变化不会影响调用它的客户类。对客户屏蔽了子系统组件减少了客户处理的对象数目并使得子系统使用起来更加容易。 缺点 不符合开闭原则修改很麻烦 5.5.4 使用场景 对分层结构系统构建时使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。当一个复杂系统的子系统很多时外观模式可以为系统设计一个简单的接口供外界访问。当客户端与多个子系统之间存在很大的联系时引入外观模式可将它们分离从而提高子系统的独立性和可移植性。 5.5.5 源码解析tomcat 使用tomcat作为web容器时接收浏览器发送过来的请求tomcat会将请求信息封装成Servlet Request对象如下图①处对象。 但是大家想想ServletRequest是一个接口它还有一个子接口HttpServletRequest而我们知道该request对象肯定是一个HttpServletRequest对象和ServletRequest共同的子实现类对象到底是哪个类的对象呢可以通过输出request对象我们就会发现是一个名为RequestFacade的类的对象。 RequestFacade类就使用了外观模式。先看结构图 为什么在此处使用外观模式呢 定义 RequestFacade 类分别实现 ServletRequest 同时定义私有成员变量 Request 并且方法的实现调用 Request 的实现。然后将 RequestFacade上转为 ServletRequest 传给 servlet 的 service 方法这样即使在 servlet 中被下转为 RequestFacade 也不能访问私有成员变量对象中的方法。既用了 Request 又能防止其中方法被不合理的访问。 5.6 组合模式 day04 5.6.1 概述 对于这个图片肯定会非常熟悉上图我们可以看做是一个文件系统对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树当我们找到某个叶子节点后就可以对叶子节点进行相关的操作。可以将这颗树理解成一个大的容器容器里面包含很多的成员对象这些成员对象既可是容器对象也可以是叶子对象。但是由于容器对象和叶子对象在功能上面的区别使得我们在使用的过程中必须要区分容器对象和叶子对象但是这样就会给客户带来不必要的麻烦作为客户而已它始终希望能够一致的对待容器对象和叶子对象。 定义 又名部分整体模式是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象用来表示部分以及整体层次。这种类型的设计模式属于结构型模式它创建了对象组的树形结构。 5.6.2 结构 组合模式主要包含三种角色 抽象根节点Component定义系统各层次对象的共有方法和属性可以预先定义一些默认行为和属性。树枝节点Composite定义树枝节点的行为存储子节点组合树枝节点和叶子节点形成一个树形结构。叶子节点Leaf叶子节点对象其下再无分支是系统层次遍历的最小单位。 5.6.3 案例实现 【例】软件菜单 如下图我们在访问别的一些管理系统时经常可以看到类似的菜单。 一个菜单可以包含菜单项菜单项是指不再包含其他内容的菜单条目也可以包含带有其他菜单项的菜单因此使用组合模式描述菜单就很恰当我们的需求是针对一个菜单打印出其包含的所有菜单以及菜单项的名称。 要实现该案例我们先画出类图 代码实现 不管是菜单还是菜单项都应该继承自统一的接口这里姑且将这个统一的接口称为菜单组件。 //菜单组件 不管是菜单还是菜单项都应该继承该类 public abstract class MenuComponent {protected String name;protected int level;//添加菜单public void add(MenuComponent menuComponent){throw new UnsupportedOperationException();}//移除菜单public void remove(MenuComponent menuComponent){throw new UnsupportedOperationException();}//获取指定的子菜单public MenuComponent getChild(int i){throw new UnsupportedOperationException();}//获取菜单名称public String getName(){return name;}public void print(){throw new UnsupportedOperationException();} } 这里的MenuComponent定义为抽象类因为有一些共有的属性和行为要在该类中实现Menu和MenuItem类就可以只覆盖自己感兴趣的方法而不用搭理不需要或者不感兴趣的方法举例来说Menu类可以包含子菜单因此需要覆盖add()、remove()、getChild()方法但是MenuItem就不应该有这些方法。这里给出的默认实现是抛出异常你也可以根据自己的需要改写默认实现。 public class Menu extends MenuComponent {//菜单可以有 多个子菜单 或者 子菜单项private ListMenuComponent menuComponentList;public Menu(String name,int level){this.level level;this.name name;menuComponentList new ArrayListMenuComponent();}Overridepublic void add(MenuComponent menuComponent) {menuComponentList.add(menuComponent);}Overridepublic void remove(MenuComponent menuComponent) {menuComponentList.remove(menuComponent);}Overridepublic MenuComponent getChild(int i) {return menuComponentList.get(i);}Overridepublic void print() {for (int i 1; i level; i) {System.out.print(--);}System.out.println(name);for (MenuComponent menuComponent : menuComponentList) {menuComponent.print();}} } Menu类已经实现了除了getName方法的其他所有方法因为Menu类具有添加菜单移除菜单和获取子菜单的功能。 public class MenuItem extends MenuComponent {public MenuItem(String name,int level) {this.name name;this.level level;}Overridepublic void print() {for (int i 1; i level; i) {System.out.print(--);}System.out.println(name);} } MenuItem是菜单项不能再有子菜单所以添加菜单移除菜单和获取子菜单的功能并不能实现。 5.6.4 组合模式的分类 在使用组合模式时根据抽象构件类的定义形式我们可将组合模式分为透明组合模式和安全组合模式两种形式。 透明组合模式 透明组合模式中抽象根节点角色中声明了所有用于管理成员对象的方法比如在示例中 MenuComponent 声明了 add、remove 、getChild 方法这样做的好处是确保所有的构件类都有相同的接口。透明组合模式也是组合模式的标准形式。 透明组合模式的缺点是不够安全因为叶子对象和容器对象在本质上是有区别的叶子对象不可能有下一个层次的对象即不可能包含成员对象因此为其提供 add()、remove() 等方法是没有意义的这在编译阶段不会出错但在运行阶段如果调用这些方法可能会出错如果没有提供相应的错误处理代码 安全组合模式 在安全组合模式中在抽象构件角色中没有声明任何用于管理成员对象的方法而是在树枝节点 Menu 类中声明并实现这些方法。 安全组合模式的缺点是不够透明因为叶子构件和容器构件具有不同的方法且容器构件中那些用于管理成员对象的方法没有在抽象构件类中定义因此客户端不能完全针对抽象编程必须有区别地对待叶子构件和容器构件。 5.6.5 优点 组合模式可以清楚地定义分层次的复杂对象表示对象的全部或部分层次它让客户端忽略了层次的差异方便对整个层次结构进行控制。客户端可以一致地使用一个组合结构或其中单个对象不必关心处理的是单个对象还是整个组合结构简化了客户端代码。在组合模式中增加新的树枝节点和叶子节点都很方便无须对现有类库进行任何修改符合“开闭原则”。组合模式为树形结构的面向对象实现提供了一种灵活的解决方案通过叶子节点和树枝节点的递归组合可以形成复杂的树形结构但对树形结构的控制却非常简单。 5.6.6 使用场景 组合模式正是应树形结构而生所以组合模式的使用场景就是出现树形结构的地方。比如文件目录显示多级目录呈现等树形结构数据的操作。 5.7 享元模式无 5.7.1 概述 定义 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销从而提高系统资源的利用率。 5.7.2 结构 享元Flyweight 模式中存在以下两种状态 内部状态即不会随着环境的改变而改变的可共享部分。外部状态指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用中的这两种状态并将外部状态外部化。 享元模式的主要有以下角色 抽象享元角色Flyweight通常是一个接口或抽象类在抽象享元类中声明了具体享元类公共的方法这些方法可以向外界提供享元对象的内部数据内部状态同时也可以通过这些方法来设置外部数据外部状态。具体享元Concrete Flyweight角色 它实现了抽象享元类称为享元对象在具体享元类中为内部状态提供了存储空间。通常我们可以结合单例模式来设计具体享元类为每一个具体享元类提供唯一的享元对象。非享元Unsharable Flyweight)角色 并不是所有的抽象享元类的子类都需要被共享不能被共享的子类可设计为非共享具体享元类当需要一个非共享具体享元类的对象时可以直接通过实例化创建。享元工厂Flyweight Factory角色 负责创建和管理享元角色。当客户对象请求一个享元对象时享元工厂检査系统中是否存在符合要求的享元对象如果存在则提供给客户如果不存在的话则创建一个新的享元对象。 5.7.3 案例实现 【例】俄罗斯方块 下面的图片是众所周知的俄罗斯方块中的一个个方块如果在俄罗斯方块这个游戏中每个不同的方块都是一个实例对象这些对象就要占用很多的内存空间下面利用享元模式进行实现。 先来看类图 代码如下 俄罗斯方块有不同的形状我们可以对这些形状向上抽取出AbstractBox用来定义共性的属性和行为。 public abstract class AbstractBox {public abstract String getShape();public void display(String color) {System.out.println(方块形状 this.getShape() 颜色 color);} } 接下来就是定义不同的形状了IBox类、LBox类、OBox类等。 public class IBox extends AbstractBox {Overridepublic String getShape() {return I;} }public class LBox extends AbstractBox {Overridepublic String getShape() {return L;} }public class OBox extends AbstractBox {Overridepublic String getShape() {return O;} } 提供了一个工厂类BoxFactory用来管理享元对象也就是AbstractBox子类对象该工厂类对象只需要一个所以可以使用单例模式。并给工厂类提供一个获取形状的方法。 public class BoxFactory {private static HashMapString, AbstractBox map;private BoxFactory() {map new HashMapString, AbstractBox();AbstractBox iBox new IBox();AbstractBox lBox new LBox();AbstractBox oBox new OBox();map.put(I, iBox);map.put(L, lBox);map.put(O, oBox);}public static final BoxFactory getInstance() {return SingletonHolder.INSTANCE;}private static class SingletonHolder {private static final BoxFactory INSTANCE new BoxFactory();}public AbstractBox getBox(String key) {return map.get(key);} } 5.7.5 优缺点和使用场景 1优点 极大减少内存中相似或相同对象数量节约系统资源提供系统性能享元模式中的外部状态相对独立且不影响内部状态 2缺点 为了使对象可以共享需要将享元对象的部分状态外部化分离内部状态和外部状态使程序逻辑复杂 3使用场景 一个系统有大量相同或者相似的对象造成内存的大量耗费。对象的大部分状态都可以外部化可以将这些外部状态传入对象中。在使用享元模式时需要维护一个存储享元对象的享元池而这需要耗费一定的系统资源因此应当在需要多次重复使用享元对象时才值得使用享元模式。 5.7.6 JDK源码解析 Integer类使用了享元模式。我们先看下面的例子 public class Demo {public static void main(String[] args) {Integer i1 127;Integer i2 127;System.out.println(i1和i2对象是否是同一个对象 (i1 i2));Integer i3 128;Integer i4 128;System.out.println(i3和i4对象是否是同一个对象 (i3 i4));} } 运行上面代码结果如下 为什么第一个输出语句输出的是true第二个输出语句输出的是false通过反编译软件进行反编译代码如下 public class Demo {public static void main(String[] args) {Integer i1 Integer.valueOf((int)127);Integer i2 Integer.valueOf((int)127);System.out.println((String)new StringBuilder().append((String)i1\u548ci2\u5bf9\u8c61\u662f\u5426\u662f\u540c\u4e00\u4e2a\u5bf9\u8c61\uff1f).append((boolean)(i1 i2)).toString());Integer i3 Integer.valueOf((int)128);Integer i4 Integer.valueOf((int)128);System.out.println((String)new StringBuilder().append((String)i3\u548ci4\u5bf9\u8c61\u662f\u5426\u662f\u540c\u4e00\u4e2a\u5bf9\u8c61\uff1f).append((boolean)(i3 i4)).toString());} } 上面代码可以看到直接给Integer类型的变量赋值基本数据类型数据的操作底层使用的是 valueOf() 所以只需要看该方法即可 public final class Integer extends Number implements ComparableInteger {public static Integer valueOf(int i) {if (i IntegerCache.low i IntegerCache.high)return IntegerCache.cache[i (-IntegerCache.low)];return new Integer(i);}private static class IntegerCache {static final int low -128;static final int high;static final Integer cache[];static {int h 127;String integerCacheHighPropValue sun.misc.VM.getSavedProperty(java.lang.Integer.IntegerCache.high);if (integerCacheHighPropValue ! null) {try {int i parseInt(integerCacheHighPropValue);i Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {}}high h;cache new Integer[(high - low) 1];int j low;for(int k 0; k cache.length; k)cache[k] new Integer(j);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high 127;}private IntegerCache() {}} } 可以看到 Integer 默认先创建并缓存 -128 ~ 127 之间数的 Integer 对象当调用 valueOf 时如果参数在 -128 ~ 127 之间则计算下标并从缓存中返回否则创建一个新的 Integer 对象。 非常感谢您阅读到这里创作不易如果这篇文章对您有帮助希望能留下您的点赞 关注 收藏 评论感谢支持 听说 三连能够给人 带来好运更有可能年入百w进入大厂上岸
http://www.dnsts.com.cn/news/117575.html

相关文章:

  • 东莞网站建设 南城石佳南宁建站官网
  • 建设信源网站导购网站一站式建站
  • 网站开发维护招聘本地建站软件
  • 百度怎么做网站排名批量爆破wordpress后台密码
  • 建立网站需要投入的成本网站开发的编程语言
  • 2个网站 同意内容 百度优化六安头条网
  • 网站基本模块网站按钮psd
  • 院感质控中心网站建设 申请成都全网营销型网站
  • 淮北网站开发网站怎样设计网页
  • 怎么做无损mp3下载网站做常识的网站
  • 淘宝建设网站的小型的游戏网站怎么做
  • 源码购买网站代理网址网站
  • 广州市天河区建设和水务局网站深圳全网推广效果如何
  • 宁波北仑网站建设学做衣服上什么网站好
  • 宁波品牌网站建设服务电话wordpress如何播放百度云视频
  • 如何设置网站会员郑州做网站好的公司
  • 建设银行网站短信错误6次做网站业务提成多少
  • 双语网站管理系统wordpress还原数据库
  • 建设银行网站怎么修改手机号码公司做网站多少钱乐器
  • 如何能把网站做的更大福建省建设执业资格管理注册中心网站
  • 网站配资公司网站工业设计公司如何运营
  • 微软做网站软件网站内页可以做关键词优化吗
  • 枣阳网站定制企业信用信息查询公示系统河北
  • 深圳网站优化效果网站建设功能文档
  • 网站内容框架做外国网用哪些网站
  • 做网站后端需要什么语言珠海网络营销外包收费情况
  • 响应式网站外包公司网站备案需要哪些资料
  • 什么网站备案容易审核建设文库网站
  • 微网站制作方案室内设计师联盟账号
  • 男人和女人做不可描述的事情的网站宝塔建站详细教程