码迷,mamicode.com
首页 > 其他好文 > 详细

《大话设计模式》学习笔记

时间:2018-03-03 21:53:04      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:主题   cat   延迟   扩展性   策略   计算   ima   附加   .sh   

今天睡醒后就拿起《大话设计模式》这本书来看,更是看的一天饭也没吃。我对于设计模式只是一知半解,看了之后感觉受益匪浅。在此做个小笔记。也强烈建议像我这样的萌新去看看。

前言

首先复习一下向对象编程的优点:可维护,可复用,可扩展,灵活性好

面向对象的好处:(原文)

之后当我学习了面向对象的分析设计编程思想,开始考虑通过封装、继承、多态把程序的耦合度降低,传统印刷术的问题就在于
所有字都刻在同一版面上造成耦合度太高太高所致,开始同设计模式使得程序更加的灵活,容易修改,并且易于复用。

 

(1).<简单工厂模式>(书本例子:计算器的实现)

主要是利用继承的特性,

父类对象的引用指向一个子类的对象。

工厂根据输入要求,实例化出合适的子类对象返回给父类。

public class AnimalFactory {
    private Animal anima;
    public Animal getAnimal(String name) {
        if(name.equals("cat")) {
            anima = new Cat();//继承Animal类
        } else {
            anima = new Dog();//继承Animal类
  }
  
return anima; }
}
//使用AnimalFactory工厂获取实例对象
Animal anima = AnimalFactory.getAnimal("cat");
//调用anima的方法
anima.yell();

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

(2).<策略模式Strategy>(书本例子:商场收银软件)

定义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 

策略上下文 类

public class StrategyContext {
    private Method method;
    public StrategyContext(Method method) {//抽象策略类
        this.method = method;
    }
    public String getTotle() {
        method.getTotleMoney();//不同的实现类有不同的算法
    }
}

客户端调用

StrategyContext methodContext = null;
    if(?) {
        methodContext = new StrategyContext(new CashNormal());//CashNormal继承了Method抽象策略类
    } else {
        methodContext = new StrategyContext(new CashRebate());//CashRebate继承了Method抽象策略类
    }
    animaContext.getTotleMoney();//算法

策略模式经常与简单工厂模式一起使用

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是具体实现不同,他可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合

策略模式封装了变化

(3).<装饰模式Decorator>(书本例子:怎么穿衣打扮)

定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

类似与一个对象调用链。所有Decorator类都继承同一个类。

public class PersonA extends Person{
    private Person component;
    public void decorate(Person component) {
        this.component = component;
    }
    @Override
    public void show() {
        System.out.println("PersonA: 在装饰类的show方法多加一句打印");
        component.show();
    }
}
      Person p1 = new Person();
        PersonA p2 = new PersonA();
        PersonB p3 = new PersonB();
        p2.decorate(p1);
        p3.decorate(p2);
        p3.show();
使用场景:
● 需要扩展一个类的功能,或给一个类增加附加功能。
● 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
● 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。

(4).<代理模式Proxy>(书本例子:替别人送情书)

定义:为其他对象提供一种代理以控制对这个对象的访问 。

代理类 和 被代理类 实现同一个主题接口,

代理类中包含被代理类的实例,其他类调用代理类的代理方法

public class PersonA extends Person{
    private PersonB personB;
    @Override
    public void proxy() {
        if(personB == null) {
            personB = new PersonB();
        }
        personB.proxy();
    }
}

应用场景:

1.远程代理,也就是为一个对象在不同的地址空间提供局部代理。这样可以隐藏一个对象存在于不同地址空间的事实。

2.虚拟代理,根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

3.安全代理,用来控制真实对象访问时的权限,一般用于对象应该有不同的访问权限的时候。

4.智能指引,是指当调用真实的对象时,代理处理另外一些事。

(4).<工厂方法模式>(书本例子:学雷锋做好事)

定义:

 

设计原则:

(1)单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原则。

接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。

单一职责原则有什么好处: 
● 类的复杂性降低,实现什么职责都有清晰明确的定义;
● 可读性提高,复杂性降低,那当然可读性提高了; 
● 可维护性提高,可读性提高,那当然更容易维护了; 
变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。

 

(2)开放-封闭原则(OCP):就说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。

对于扩展是开放的,对于更改是封闭的

怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?

变化的三种类型:
①逻辑变化 
只变化一个逻辑,而不涉及其他模块,比如原有的一个算法是a*b+c,现在需要修改为a*b*c,可以通过修改原有类中的方法的方式来完成,前提条件是所有依赖或关联类都按照相同的逻辑处理。
②子模块变化 
一个模块变化,会对其他的模块产生影响,特别是一个低层次的模块变化必然引起高层模块的变化,因此在通过扩展完成变化时,高层次的模块修改是必然的。
③可见视图变化
可见视图是提供给客户使用的界面,如JSP程序、Swing界面等,该部分的变化一般会引起连锁反应(特别是在国内做项目,做欧美的外包项目一般不会影响太大)。可以通过扩展来完成变化,这要看我们原有的设计是否灵活。
 
(3)依赖倒装原则(DEP):
A:高层模块不应该依赖底层模块。两个都应该依赖抽象。
B:抽象不应该依赖细节。细节应该依赖抽象。
结合    里氏代换原则(LSP):子类型必须能够替换掉它们的父类型。
依赖倒置原则在java语言中的体现:
①模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
②接口或抽象类不依赖于实现类;
③实现类依赖接口或抽象类。
依赖的三种写法
①构造函数传递依赖对象(构造函数注入)
②Setter方法传递依赖对象(setter依赖注入)
③接口声明依赖对象(接口注入)
使用原则:
依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合,我们怎么在项目中使用这个规则呢?只要遵循以下的几个规则就可以:
①每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备
②变量的表面类型尽量是接口或者是抽象类
③任何类都不应该从具体类派生(只要不超过两层的继承是可以忍受的)
④尽量不要复写基类的方法

 

《大话设计模式》学习笔记

标签:主题   cat   延迟   扩展性   策略   计算   ima   附加   .sh   

原文地址:https://www.cnblogs.com/zhaww/p/8503110.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!