七大实际原则

大设计原则是什么?都有什么含义?由于太简单,不展示代码

开闭原则:(最终目标)
    对扩展开发,对修改关闭。
    开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。
    【例1】Windows 的桌面主题设计。
        分析:Windows 的主题是桌面背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换自己的桌面主题,也可以从网上下载新的主题。
        这些主题有共同的特点,可以为其定义一个抽象类(Abstract Subject),而每个具体的主题(Specific Subject)是其子类。
        用户窗体可以根据需要选择或者增加新的主题,而不需要修改原代码,所以它是满足开闭原则的。

里氏替换:
    子类可以扩展父类的功能,但不能改变父类原有的功能。里氏替换原则是实现开闭原则的重要方式之一。
    在任何使用父类对象的地方,替换为子类对象以后,程序不会有问题出现。
    【例1】长方形不属于正方形,鸵鸟不是鸟。  (鸟)鸵鸟  这样就会出现问题,鸵鸟能飞了。你可以再取一个中间抽象,能不能飞的鸟。。。具体不扩展

依赖倒置:
    其核心思想是:要面向接口编程,不要面向实现编程。依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合。
    依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性:所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则
            每个类尽量提供接口或抽象类,或者两者都具备。
            变量的声明类型尽量是接口或者是抽象类。
            任何类都不应该从具体类派生。
            使用继承时尽量遵循里氏替换原则。
    【例1】 上层不能依赖于下层,它们都应该依赖于抽象举例:dao, service通过dao接口+dao工厂来访问下层的dao实现的。在以后扩展dao实现的时候,上层 service是不用改动的。
            注解:当你在service层中使用dao层的时候,没有说用哪个dao类型,如果是MySQL或Oracle,可以在你用daoImpl的时候指定要哪个数据库。改的话只改dao层。
                    到时候可以用,工厂方法,跟配置,得到你要的数据连接对象

单一职责:
    ー个类,一个方法,只负责一件事。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。
    【例1】项目经理管项目,产品经理管产品,程序员管代码。 互不冲突。

接口隔离:
    使用多个专门的接口比使用单一的总接口要好。提高灵活性跟可扩展性
    【例1】IBookDao ICarDao

迪米特法则:(最少知道原则。)
    一个类,对于另外一个类,应该知道的越少越好(封装)只和朋友通信。
    a.方法参数
    b.方法返回类型方法内
    c.实例化出来的局部变量
    d.类中的字段。
    【例1】明星与经纪人的关系实例。
    明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则

组合优于继承:(也称合成复用原则)

    如果要使用继承关系,则必须严格遵循里氏替换原则。

    通常类的复用分为继承复用和合成复用两种,继承复用虽然有简单和易实现的优点,但它也存在以下缺点。
        继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
        子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。 这就是重写的缺点,但是里氏替换控制了这一特点,但却可以存在
        它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。 就是已经继承了,就继承了。如果我突然想用别的类的东西怎么办呢?等死!

    采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点。
        它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
        新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。  service跟dao
        复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。  解释简单工厂可以。

    如果父类和子类作者不是同一个人,那么就慎用继承。why???
    因为,父类作者不知道未来的用户,会重写自己的什么方法子类作者不知道作者在未来的版本里,会改写什么方法,添加什么新方法。
    如果父类和子类作者是同一个人,那么可以会用继承。
    【例1】Stack继承了Vector,搞得堆不像堆,栈不像栈

你可能感兴趣的:(设计模式,设计模式)