什么是设计模式

在大学时候,教授讲设计模式和算法大家都是在睡觉......并没有人觉得他们有用。

什么是设计模式

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

重点在哪里?在于设计。
在我们不清楚原型看不清我们到底需要什么的时候,产品经理把需求交给ui,ui设计出了界面。因此前端,后端,产品经理,项目经理,架构师瞬间直观的看懂了。
在中国人关于工程的概念中大概和德国人不太一样。
德国人架在设计然后工程化,中国人喜欢按照思路工程化,对于上层的设计每个人没有责任感。

我们现在写的代码风格应该是建立在设计模式的基础上,但是我们每天敲代码并不知道设计这回事。

所以设计模式,一般编程,算法优化应该是这个顺序吧。
其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。

  

设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。
项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,
以及该问题的核心解决方案,这也是它能被广泛应用的原因。 每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。

  

设计模式的四个基本要素

模式名称、问题、解决方案、效果

  

经典的《设计模式》一书归纳出23种设计模式,这23种模式又可归为,创建型、结构型和行为型3大类

 

设计模式的分类  

创建型模式

  对象的创建和对象的使用分开成为了必然趋势。因为对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,
从而能够高效地创建对象就是创建型模式要探讨的问题。这里有6个具体的创建型模式可供研究,它们分别是: 简单工厂模式(Simple Factory); 工厂方法模式(Factory Method); 抽象工厂模式(Abstract Factory); 创建者模式(Builder); 原型模式(Prototype); 单例模式(Singleton)。 说明:严格来说,简单工厂模式不是GoF总结出来的23种设计模式之一。 依赖于继承的创建型模式:工厂方法模式 依赖于组合的创建性模式:抽象工厂模式、创建者模式 结构型模式   在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,
因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。
对象结构的设计很容易体现出设计人员水平的高低,这里有7个具体的结构型模式可供研究,它们分别是: 适配器模式(Adapter); 桥模式(Bridge); 组合模式(Composite); 装饰模式(Decorator); 外观模式(Facade); 享元模式(Flyweight) 代理模式(Proxy); 行为型模式 在对象的结构和对象的创建问题都解决了之后,就剩下对象的行为问题了,如果对象的行为设计的好,那么对象的行为就会更清晰,
它们之间的协作效率就会提高,这里有11个具体的行为型模式可供研究,它们分别是: 解释器模式(Interpreter)。 责任链模式(Chain of Responsibility); 命令模式(Command); 迭代器模式(Iterator); 中介者模式(Mediator); 备忘录模式(Memento); 观察者模式(Observer); 状态模式(State); 策略模式(Strategy); 访问者模式(Visitor); 模板方法模式(Template Method);

  

设计模式的六大原则

1、开闭原则

  开闭原则就是说:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。
想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2、里氏替换原则   里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。
及所有引用基类(父类)的地方必须能透明地使用其子类的对象。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,
而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。
而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 3、依赖倒置原则   这个是开闭原则的基础,高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
换言之,要针对接口编程,而不是针对实现编程。具体内容:是对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则   这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,
其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。总结概括:使用多个专门的接口,
而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口;降低依赖,降低耦合。 5、迪米特法则(最少知道原则)   为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 6、单一职责原则:   不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

  

面向对象与设计模式

面向对象三大特性:封装,继承,多态

封装:
  1、把数据和函数包装在类里
  2、类的边界限制了一些外界的访问 ---》 私有属性

继承:解决代码复用 重写方法叫做:override 重写,复写

多态:父类可以代表子类

抽象类:
  抽象类不能被实例化
  抽象类的抽象方法,必须在子类中实现

接口:
  一种特殊的类,声明了若干方法,要求继承该接口的类必须实现这些方法。
  作用:限制继承接口的类的方法的名称及调用方式;隐藏了类的内部实现。
  接口就是一种抽象的基类(父类),限制继承它的类必须实现接口中定义的某些方法

  

例子:

from abc import abstractmethod, ABCMeta

#定义抽象类
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        """支付方法,参数money,每个继承的类都要实现这个方法"""
        pass

#实现Payment接口
class Alipay(Payment):
    def pay(self, money):
        print("支付宝支付%s元"%money)


class ApplePay(Payment):
    def pay(self, money):
        print("苹果支付%s元"%money)


class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%s元"%money)


def func(x):
    x.pay(100)

接口应用代码举例

  

 

posted @ 2017-09-21 19:40  Adamanter  阅读(166)  评论(0编辑  收藏  举报