面向对象编程之设计模式总结

本文总结了面向对象编程中的多种设计模式,包括简单工厂、策略、开放-封闭原则、单例、工厂方法、原型、模板方法、观察者、装饰、代理、外观、建造者、抽象工厂、状态、适配器、备忘录、组合、迭代器、桥接、命令、职责链、中介者、享元和访问者模式。每种模式都阐述了其核心思想和应用场景,帮助理解并应用这些设计模式。
摘要由CSDN通过智能技术生成

简单工厂模式:提供参数,根据形参返回具体子类的实例,而返回类型是父类,这个过程利用了多态。

策略模式:构造器形参是父类,而传入的是子类,父类调用方法A等价于调用子类的方法A。

开放-封闭原则:对类的实现,以后可以通过继承更多子类进行扩展,但是不应在原来的类上做修改。

单一职责原则:每个类职责鲜明,不应有超出其本应有的功能。

依赖倒转原则:高层模块不应依赖底层模块,高层模块应依赖抽象或接口,而底层模块由抽象或接口继承实现。

装饰模式:每个装饰子类只关心自己的功能完善,至于加入装饰链条的操作,交给某个类方法比如setComponent同意完成。

代理模式:在代理内部有代理对象类的实例,代理类的方法的实现的实质就是调用代理对象实例的相应方法。其作用是为其他对象提供代理,以提供对该对象的访问控制,如在访问前做一些内务处理(智能代理);也可以为一个存在于不同地址空间的对象提供局部代表(远程代理);也可以用于存放实例化耗时很长的类(虚拟代理);控制访问权限(安全代理)。

工厂方法模式:每一个子类都对应一个工厂子类,一个工厂子类可以生产一个对象子类实例。

原型模式:通过克隆方式从已有实例中克隆出新实例,并对新实例中的部分属性做修改。

模板方法模式:子类继承父类,并重写父类方法。即把父类当模板。

迪米特法则:尽量降低成员访问权限,使类之间松耦合,相互调用尽量通过第三方,如接口抽象类。

外观模式:在一个大型遗留系统外围套一个接口层,以供外界调用。

建造者模式:建造类的建造方法接收原材料对象,按钦定的程序在内部走一遍流程,使用者可以再调用建造类的getResult()查看方法。

观察者模式:监听者和被监听对象相互耦合,被监听者发生变化就通知监听者,监听者就去获取被监听者中的更新信息。

单例模式:类的构造方法为private,getInstance()判断实例全局变量为空,则创建一个实例。多线程时利用双重检查锁if(isNull?) synchronized{ if(isNull?) {……}}——但其实这是不安全的,由于重排序,jvm中Instance类可能会被先new出一个空的实例对象,当另一个线程发现了这个实例对象,会误以为已经创建成功了,于是率先返回了这个错误的实例。解决方法:

1) 可用volatile修饰Instance;

2)可对整个getInstance()方法使用synchronized(使return语句也在同步范围内),但这样效率低下。

3)class  Resource{

    private static class ResourceHolder{

        public static Object resouce = new Object();

    }

 

    public static Object getResource(){

        return ResourceHolder.resouce;

    }

}

---------------------

由于static的特性,可以保证延迟初始化(使用该类时才会被加载进来)和线程安全。

抽象工厂模式:工厂返回的实例是抽象类,即一个抽象工厂衍生出很多子工厂,根据所给形参(类似于简单工厂)(形参可以是String,可用于反射)返回不一样的子工厂(利用了多态)。

状态模式:是一个有限状态机,Work类和State的子类双向耦合。work类先设有初始状态和一个变量值,根据变量值向状态类提出变化请求,状态类根据变量值做出条件判断,条件不符合则修改work类中的状态,并且再次向work类发出状态变化的请求,直到达到条件符合的稳态。

适配器模式:当系统与外界的接口不符合时,使用适配器,如为了适应第三方组件。

备忘录模式:比较简单,就是把Origin类的state属性保存到Memo类的state属性中,有必要时则读取。不过Memo类的创建和读取只能交给CareTaker类来进行。

组合模式:Component的两种子类:叶子结点和非叶结点。非叶结点可以add、remove子结点,叶子结点不能add、remove。于是每个非叶结点都可以组合无穷多子节点。这种模式使客户可以一致地使用组合结构和单个对象。

迭代器模式:

桥接者模式:聚合/合成原则(尽量使用合成、聚合,不使用继承)。手机可按品牌分类,也可按软件分类。不妨在品牌子类中增加软件子类属性,这样可以把品牌和软件两种类聚合起来。

命令模式:将请求操作对象化,客户的所有请求计入队列,可随时增删,之后统一执行。

职责链模式:h1类中h2类的实例属性,h2中有h3的实例属性,当执行h1的handle()方法,若h1无法处理,就交给h2,h2不行就交给h3。类似于简化版的状态模式。

中介者模式:两个类信息交流,却不直接发生作用,而是分别与中介发生双向耦合(类似观察者模式)。c1向中介发送String和this,中介就会去提醒c2;c2向中介也发送String和this,中介就会去提醒c1。即中介中含有c1和c2的实例,c1、c2中仅含有中介的实例。例如计算器程序,其上的各个计算组件只与计算器form发生交互。

享元模式:类似于单例模式,工厂类只创了一个单例实例存进Map中,对于同一个key返回同一个实例。

解释器模式:没什么特别的,只是把字串遍历,使用switch进行分类,然后解释出含义。

访问者模式:向一个Structure中固定数量的元素(已确定的),该Structure每接待一个访问者,就会令所有元素挨个调用accept(访问者)来处理,访问者在accept()方法中,调用自己的发方法visitor.handle(this)来处理这个元素。(这里用到了两次分派,第一分派是元素处理访问者,第二次分派,访问者用自己的方法处理元素)。这个模式中,元素是固定数据结构,访问者(作为新算法)可以任意继承增加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值