Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

head first 设计模式-0x01 #13

Open
ichengzi opened this issue May 7, 2020 · 1 comment
Open

head first 设计模式-0x01 #13

ichengzi opened this issue May 7, 2020 · 1 comment

Comments

@ichengzi
Copy link
Owner

ichengzi commented May 7, 2020

设计模式是前人的OO设计经验, 用于设计 可复用,可维护,可扩展的OO应用。

明白OO的基本概念(基本特征), 并不能马上设计出 可复用,可维护,可扩展的高质量应用。设计模式是前人实践总结的经验,可以帮助你快速达到这个目标。

一切为了高质量的OO应用,实现OO编程。

设计模式不是发明, 而是被发现。

大多数的原则和模式, 都是着眼于「软件变化这一主题」。

一般而言, 软件开发完成后 比 开发完成前, 需要花费更多时间。用于应用的维护和需求的变化。

设计模式不只是存在于应用的设计阶段,而是可以应用于应用的整个生命周期中。

> `OO基本特征 <-- OO设计原则 <-- OO设计模式` 

OO基本特征

  1. 抽象
  2. 继承
  3. 多态
  4. 封装

OO原则

> 原则用于指导实际应用中的设计,原则是适用于所有设计模式的。当没有合适的模式经验可用时,遵守OO原则
  1. 多用组合, 少用继承

  2. 面向接口编程(多态的应用)

    声明的类型是超类型(super type, 可以是java中的接口或抽象类),然后运行时, 实例化的时候,实现此超类型的实例都可以赋值给这个 super type

  3. 封装变化

    • 找到应用中需要变化之处, 把他们独立出来, 不要和那些不需要变化的代码混在一起
    • 应用中某部分的改变, 不会影响到其他部分

策略模式(strategy pattern)

  1. 定义个一个算法族, 各个算法的实现可以相互替换, 算法的实现和具体的算法使用场景隔离
  2. 可以相互替换, 也即实现相同的契约,或者说相同的方法签名
  3. 算法的具体实现和算法的使用场景隔离, 保证了算法的实现是抽象的, 不掺杂具体的场景, 替换到别的场景同样可以工作
public abstract class Duck{
    public Duck(){
        
    }
    private FlyBehavior flyBehavior;
    public setFlyBehavior(FlyBehavior flyBehavior){
        this.flyBehavior = flyBehavior;
    }
    public void performFly(){
        flyBehaior.doFly();
    }
    public abstract void display();
}

public interface FlyBehavior(){
    public void doFly();
}
public class FlyWithWings implements FlyBehavior{
    public void doFly(){
        System.out.println("fly with wings.");
    }
}

public class DemoDuck() extends Duck{
    public static void main(String[] args){
        Duck duck = new DemoDuck();
        duck.setFlyBehavior(new FlyWithWings());
        duck.performFly();
        duck.display();
    }
    public void display(){
        System.out.println("demo duck.");
    }
}
@ichengzi
Copy link
Owner Author

ichengzi commented May 7, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant