文章目录
10.设计模式&OO原则概览
-
OO基本概念
- 抽象
- 封装
- 继承
- 多态
-
OO原则
- 封装变化
- 多用组合,少用继承
- 针对接口编程,不针对实现编程
- 为交互对象之间的松耦合而努力
-
设计原则
- 找出可能变化的代码,把他独立封装,不要和那些不需要变化的代码混在一起
- 针对接口编程,而不是针对实现编程
-
良好的OO设计必须具备三个特性:
- 可复用
- 可以扩充
- 可维护
-
OO原则是我们的目标,而设计模式是我们的做法
-
模式是被认为是历史验证的OO设计经验
-
大多数模式和原则,都着眼于软件变化的主题
-
知道抽象、继承、封装、多态并不会让你成为好的面向对象的设计者,设计应该更关注建立弹性的设计,可以维护,可以应对变化
-
举例
- 类图
-
代码
-
Duck
package com.desmond.codebase.designpattern.overview.v4; /** * @author presleyli * @date 2018/10/17 上午8:11 */ public abstract class Duck { private Flyable flyable; private Quackable quackable; public Flyable getFlyable() { return flyable; } public void setFlyable(Flyable flyable) { this.flyable = flyable; } public Quackable getQuackable() { return quackable; } public void setQuackable(Quackable quackable) { this.quackable = quackable; } public void swim() { System.out.println("swimming."); } public abstract void display(); public void quack() { System.out.println("original quack."); } public void fly() { System.out.println("original fly."); } }
-
MallrdDuck
package com.desmond.codebase.designpattern.overview.v4; /** * @author presleyli * @date 2018/10/17 上午8:12 */ public class MallrdDuck extends Duck { @Override public void display() { System.out.println("green"); } @Override public void quack() { this.getQuackable().quack(); } @Override public void fly() { this.getFlyable().fly(); } }
-
RubberDuck
package com.desmond.codebase.designpattern.overview.v4; /** * @author presleyli * @date 2018/10/17 上午8:17 */ public class RubberDuck extends Duck { @Override public void display() { System.out.println("yellow"); } @Override public void quack() { this.getQuackable().quack(); } @Override public void swim() { super.swim(); } @Override public void fly() { this.getFlyable().fly(); } }
-
Flyable
package com.desmond.codebase.designpattern.overview.v4; /** * Created by presleyli on 2018/10/17. */ public interface Flyable { void fly(); }
-
CanFly
package com.desmond.codebase.designpattern.overview.v4; /** * @author presleyli * @date 2018/10/19 上午7:32 */ public class CanFly implements Flyable { @Override public void fly() { System.out.println("I can fly..."); } }
-
CannotFly
package com.desmond.codebase.designpattern.overview.v4; /** * @author presleyli * @date 2018/10/19 上午7:32 */ public class CannotFly implements Flyable { @Override public void fly() { // do nothing. } }
-
Quackable
package com.desmond.codebase.designpattern.overview.v4; /** * Created by presleyli on 2018/10/17. */ public interface Quackable { void quack(); }
-
CanQuack
package com.desmond.codebase.designpattern.overview.v4; /** * @author presleyli * @date 2018/10/19 上午7:33 */ public class CanQuack implements Quackable{ @Override public void quack() { System.out.println("I can quack..."); } }
-
CannotQuack
package com.desmond.codebase.designpattern.overview.v4; /** * @author presleyli * @date 2018/10/19 上午7:33 */ public class CannotQuack implements Quackable{ @Override public void quack() { // do nothing. } }
-
Main
package com.desmond.codebase.designpattern.overview.v4; /** * @author presleyli * @date 2018/10/17 上午8:14 */ public class Main { public static void main(String[] args) { MallrdDuck mallrdDuck = new MallrdDuck(); mallrdDuck.setFlyable(new CanFly()); mallrdDuck.setQuackable(new CannotQuack()); mallrdDuck.fly(); mallrdDuck.quack(); RubberDuck rubberDuck = new RubberDuck(); rubberDuck.setFlyable(new CanFly()); rubberDuck.setQuackable(new CanQuack()); rubberDuck.fly(); rubberDuck.quack(); } }
-
Output:
I can fly... I can fly... I can quack...
-