做网站银川,网站三大标签,谁可以做网站优化排名推广,wordpress 页面 首页因为本周五开始五一假期#xff0c;所以只有一节软件构造课。因为内容还属于创建模式、结构模式、行为模式。将该堂课的内容整合到本博客中。本周的重点是程序开发模式#xff0c;在写代码之前首先充分考虑采用哪种模式更有利于开发、维护。采用合适的设计模式帮助理清思路所以只有一节软件构造课。因为内容还属于创建模式、结构模式、行为模式。将该堂课的内容整合到本博客中。本周的重点是程序开发模式在写代码之前首先充分考虑采用哪种模式更有利于开发、维护。采用合适的设计模式帮助理清思路明确目标有“事半功倍”之效果。编写可复用代码需要更多的精力投入。
框架层面的复用
1.可分为白盒框架和黑盒框架 白盒框架通过子类型和重写方法实现扩展对应模板模式 黑盒框架通过插件接口实现扩展本质上是委托对应策略模式和观察模式 2.复用白盒框架后通过创建子类进行调用。
复用黑盒调用后通过框架程序进行调用。
3.白盒框架和黑盒框架可复用代码的位置 黑盒的可复用代码在框架中插件是自定义部分 白盒框架的可用代码是子框架的父类
结构模式
1.适配器Adapter ① 使用具有中转功能的接口将不匹配的接口统一将某个类或接口转换为用户期望的其他形式
②Rectangle类是adapterLegacyRectangle是adaptee
2.装饰器Decorator ①让类的操作产生更多的特性对每一个特性构造子类通过委派机制增加到对象上。 ②例子stack的三种附加功能
上面是接口左边是被扩充的类右边是装饰。装饰类中将基础操作比如push、pop、size操作通过引用委托到左边的被扩充类完成。 装饰类委托的类不同可以实现层层装饰的效果。比如在实现SecureStack时将其父类StackDecorator指向UndoStack则实现的SecureStack就同时具有了UndoStack功能。如果同时将UndoStack的父类指向LockedStackUndoStack就具有了LockedStack功能。 装饰类只能使用接口中的操作。 具体例子
注t无法使用undo方法只能使用接口中的push、pop、size方法。 3.外观模式Facade ①组合接口成一个统一的接口Lab3中有体现。 4.代理Proxy模式 ①某个对象比较私密/敏感/浪费资源不希望被客户端直接访问。设置proxy在二者间建立防火墙。本应该直接访问真实对象但是代价太大所以创建并访问代理对象和真实对象有同样的接口以降低代价。需要真实对象时再通过委托访问真实对象。 ②代理模式的例子
③适配器模式和代理模式的区别 适配器模式的目的是消除不兼容以客户端期望的统一的方式建立联系。接口不同。 代理模式的目的是隔离对复杂对象的访问降低代价。接口相同。
行为模式
1.策略模式Strategy ①某个接口通用有多个实现使用委托根据不同实际情况进行调用切换。 2.模板模式Template method ①使用继承和重写实现。一个类作为模板用子类进行继承和扩充。共性的步骤在抽象类内公共实现差异化的步骤在各个子类中实现。 3.迭代器Iterator ①用迭代器对集合进行操作。客户端希望遍历被放入容器/集合类的一组ADT对象无需关心容器的具体类型。即是不管对象被放进哪里都提供同样的遍历方式。 ②迭代器是可变类。使用时集合中的当前对象有两个引用一个来自集合另一个来自迭代器。所以不使用迭代器遍历时不能删除元素即只能使用迭代器的remove进行删除。 4.观察者Observer模式 ①类似于广播的一对多模式。Sbuject维护一个Observer的集合应该具有Attach、Detach添加和删除Observer的操作和Notify改变ObserverSubject调用Observer的功能的操作。 ②观察者模式的例子 其中Observer的Subject属性可以去掉代表可以观测任意“偶像”
③Java提供Observable接口和Observer接口。 5.访问者Visitor模式 ①本质上将数据和作用于数据上的某些特定操作分离开来。 ②为ADT预留一个将来可扩展功能的“接入点”Element的accept方法外部实现的功能代码可以在不改变ADT本身的情况下通过委托接入ADT。 ③分为Visitor类和Element类。针对不同子类型的element分别实现visit操作。Element类的accept(Visitor)与特定的Visitor子类联系起来允许其对自己的数据操作。
④存在双向委托即Visitor和Element接口相互调用。 ⑤例子
⑥Visitor模式在特定ADT上执行特定操作但是该操作不在ADT内部实现而实委托到独立的Visitor对象。客户端可以灵活地扩展/改变Visitor的操作而不影响ADT。 ⑦策略模式和访问者模式的区别 二者都是通过委托建立两个对象的动态联系。但是Visitor强调的是外部定义某种对ADT的操作该操作和ADT自身关系不大只是访问ADT故ADT内部只需要开放accept(Visitor)即可客户端在外部调用。策略模式强调对ADT内部某些功能相应算法的灵活替换这些算法是ADT功能的重要组成部分只不过是委托到外部而已。 Visitor是站在外部客户端角度灵活增加对ADT的不同操作Strategy站在内部ADT的角度灵活变化对其内部功能的不同配置。
创建模式
1.工厂模式虚拟构造器 ①当客户端不知道要创建哪个具体类的实现或者不想在客户端代码中指明要具体创建的实例时使用工厂方法。定义一个用于创建对象的接口让其子类觉得实例化哪一个类从而使一个类的实例化延迟到其子类。 ②该模式中每一个工厂只创建某一种类型的产品。 ③工厂方法举例 常规情况下 Product p new ProductTwo(); 工厂模式下 Product p new ConcreteTwo.makeObject(); ④将工厂类的方法设置成static则不需要创建工厂类实例也能创建产品。 2.抽象工厂模式 ①提供接口以创建一组互相依赖的对象但不需要指明其具体类。抽象工厂负责创建每个组成部分遵循各组成部分之间的固定搭配。例如窗口分为1类型和2类型滚动条分为1类型和2类型。提供两个工厂类一个创建窗口1和滚动条1另一个创建窗口2和滚动条2。抽象工厂方法可以同时创建窗口和滚动条并且实现它们的固定组合类似于套餐。 ②该模式中每一个工厂创建多种类型的产品。
③本质上是把多类的工厂方法组合在一起特点是遵循固定搭配规则。
可维护性的度量与构造原则
1.软件维护的种类纠错性、适应性、完善性、预防性 2.提高可维护性的方法 从原则上通过模块化。 OO设计原则SOLID、GRASP OO设计模式 基于状态的构造技术 基于语法的构造技术正则表达式
模块化设计
1.模块化设计的原则直接映射、尽可能少的接口、尽可能小的接口、显式接口、信息隐藏 2.耦合和内聚
3.OO设计原则-SOLID ①单一责任原则 不应该有多于一个的原因让ADT发生变化否则就应该拆分开。责任就是变化的原因即一个类承担一个责任。 ②开放-封闭原则 对扩展性的开发对修改的封闭。模块的行为是可扩展的从而该模块可表现出新的行为以满足需求的变化。但是模块自身的代码是不应被修改的扩展模块行为的一般途径是修改模块的内部实现如果一个模块不能被修改那么它通常被认为是具有固定的行为。 针对多个实现抽象出一个具体的接口如果有新的实现继承该接口即可。从而支持了对扩展的开放。
③Liskov替换原则*** 子类型必须能够替换其父类型派生类必须能够通过其基类的接口使用客户端无需了解二者之间的差异。 ④依赖转置原则 尽量依赖接口而不是接口的具体实现类。抽象的模块不应该依赖于具体的模块具体应该依赖于抽象。
⑤接口分离原则 只提供客户端必需的接口。