常用设计模式用法总结

面向可复用的设计模式

1.结构型模式

    适配器模式Adapter:适配器模式的作用是讲某个类或者接口转换为用户期望的形式。用于已经存在一个类或者接口,可能因为规约比如参数(类型,数量,顺序),返回值等不符合客户的需求。可以自己设计一个新的接口,接口的实现中进行适配,构造满足用户需求的接口,然后方法的实现可以delegate给已经存在的类或者接口。

    装饰器模式Decorator:装饰器模式是为已经存在的对象增加侧面特性的方法。用于扩展已经存在的类特征。首先设计一个接口来定义所有的装饰器统一的属性,实现为抽象类,将需要实现的方法delegate给已经存在的对象,然后对需要增加的特征设计抽象方法,然后构造子类继承抽象类类实现抽象方法,可以对抽象类有多个实现,获得不同对原对象不同的装饰结果。

    外观模式Facade:客户端需要通过一个简化的接口来访问复杂系统内的功能,提供一个统一的接口来取代一系列小接口的调用,相当于对复杂的系统做了一个封装,简化客户端使用,便于客户端学习,解耦。

2.行为类模式

    策略模式Strategy:对于一个任务,有多实现方法供用户选择。策略模式可以方便用户在不同的方法之间切换。首先要建立一个接口,接口中定义可以实现这个任务的方法,然后多次实现这个接口,每个实现对应着不同的策略,这样用户在使用的过程中只需要定义一个接口变量,然后将不同的策略实现赋值给接口就可以实现对这个策略的使用。

    模版模式Template Method:模版模式解决的是对于一个任务,实现的步骤是一样的,但是对于这些步骤的一部分可以使用不同的具体方法。对于这种任务,构造一个抽象类,共性的过程直接在抽象类中定义方法实现,有不同方法的步骤构造为抽象方法,通过继承来对这些方法进行不同的实现。

    迭代器模式Iterator:Iterator模式是用来解决对一个集合对象的遍历问题的。让自己的集合类实现Iterable接口,并在这个接口类中定义一个实现Iterator的对象(实现hasNext(), next(), remove()方法),然后可以用这个Iterator来对这个集合类进行遍历。

面向可维护性的设计模式

1.创建者模式

    工厂方法模式Factory Method pattern:当用户不知道要创建哪个具体类的示例,或者不想在用户代码中指明要具体创建的类时,用工厂方法。定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。也可以在抽象类中定义静态工厂函数。

    抽象工厂模式Abstract Factory:抽象工厂模式提供接口以创建一组相关的对象,和工厂方法模式类似,不需要指明其具体类。其实能用抽象工厂模式实现的都能够用工厂模式来实现,但是抽象工厂模式强行把有着关系的那些放到一个抽象工厂对象中生成,方便用户获得一组相关的对象。

    构造器模式Builder:构造器模式需要获得的是一个完整的产品,产品中有许多对象,但是这些对象的构造过程是对用户隐藏的。与抽象工厂模式不同的是,抽象工厂模式可以获得多个相关的对象,而构造器模式只获得一个对象,但这个对象内部有着多个相关的对象。

    

2.结构型模式

    桥接模式Bridge:桥接者模式是建立两个具体类关系的方法。可以将两个具体类在run-time动态绑定到一起(如:A类中有着B对象的方法,在构造器中进行对象的赋值)。然后A类中一些方法的实现可以delegate给B类。和Strategy模式不同的是,Bridge是结构型模式,强调双方动态过程的链接,而Strategy模式是行为类模式,强调使用另一个类的方法。

    组合模式Composite:组合模式的目的是在同类型的对象之间建立起树型的层次结构,一个上层的对象可以包含多个下层对象(类似树的实现)。装饰器模式和其不同的是,装饰器模式强调的是同类型对象之间的特性增加的问题,是平等的,没有层次的区别。而且每次decoration只能作用于一个object。

 

3.行为类模式

    代理模式Proxy:当某个对象比较私密,不希望被用户直接访问时,可以使用代理模式。对于一个接口的某个实现,不希望被用户所直接访问,可以再对接口进行一次实现,然后在这个实现中将方法delegate给原来的类,这样用户就可以访问这个类来避免对原来类的直接访问。和Adaptor模式不同的是,Proxy模式是行为类模式,定位在“访问/使用”的层次,而Adapter是结构型模式,是为了消除不兼容,将B以客户端期望的方式和A建立起联系。

    观察者模式observer:观察者模式是实现“一对多广播”的一种模式。在被观察的类中定义一个观察者的集合类,当被观察的对象发生变化时,会调用对所有观察者的更新方法,所有的观察者的状态都会改变,隐性调用观察者行为的改变。Java也提供了Observable接口来构造被观察者以及Observer接口来构造观察者。

    访问者模式Visitor:访问者模式是对特定类型的object进行特定的操作,在运行的过程中将访问者和object动态绑定到一起,这个操作可以灵活的更改,无需更改被visit的类。本质上是将数据和作用于数据上的某些特定操作分离开来。其中访问者针对不同的element,实现不同的visit操作。对于element而言,类中定义了accept方法,将visitor子类作为参数传入,调用visit操作来对这个对象进行访问。Visitor模式是在特定ADT上执行的某种特定操作,但是该操作不再ADT内部实现,而是delegate到独立的visitor对象。

面向性能的设计模式

    单例模式Singleton Pattern:某些类在应用运行期间只需要一个实例,所以强制用户只能创建一个object,避免因为new操作所带来的时空性能损失,也便于复用。可以将对象定义为private static final,可以直接创建也可以在构造器中创建调用getInstance方法来获得这个对象。

    轻量模式Flyweight Pattern:该模式允许在应用中的不同部分共享使用object,降低大量object带来的时空代价。对于轻量模式的对象,分为内部状态和外部状态,内部状态在不同的场合都不会边,而外部状态在不同的场合分别计算产生变化。这个对象是immutable的,因为对于ADT而言,是内部状态,是不可变的,而外部状态的改变不影响ADT。

    原型模式Prototype Pattern:原型模式提倡通过克隆而非new来创建object,因为new操作的时空代价比较大,影响性能。对于一个object,可以通过让其实现Cloneable接口(Java内置)并且重写clone()方法并设置为public来实现(因为Object.clone()是protected的,其他包没有访问权限)。

    对象池模式:对象池模式仍然是关于new操作巨大的性能代价来构造的。因为很多时候,创建的对象不用就直接扔掉了,但这些对象很有可能在后续仍然能够复用。所以可以构建一个collection来存储所有要被扔掉的对象,当要使用时在回收使用,但是性能提升的代价就是不进行GC而大量占据内存。


(参考哈工大软件构造课程ppt总结)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值