设计模式入门--设计模式学习笔记一
使用模式的最好方式:
把模式装进脑子里,然后在你的设计和已有的应用中,寻找何处可以使用他。
设计原则1:
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
这个原则的另一种思考方式:“把会变化的部分取出并 封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分”。
设计原则2:
针对接口编程,而不是针对实现编程。
“针对接口编程” 真正的意思是“针对超类型 (supertype)编程”。
设计原则3:
多用组合,少用继承。
“有一个”可能比”是一个”更好
第一个设计模式:Strategy Pattern(策略模式)
定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的替换独立于使用算法的客户。
鸭子模拟:
原则1:将鸭子变化的和不变的分开。
不变:都会游泳,外貌特定不变;
变:会飞于不会飞,不同的鸭子叫声不同;
原则2:针对接口编程。
将变化的部分封装成接口:
1.使用interface封装
public interface FlyBehavior {
public void fly();
}
public interface QuackBehavior {
public void quack();
}
2.使用抽象类封装
public abstract class FlyBehavior {
public abstract void fly();
}
public abstract class QuackBehavior {
public abstract void quack();
}
实现变化部分:
public class FlyNoWay extends FlyBehavior{
@Override
public void fly() {
System.out.print("Ican't fly!!");
}
}
public class FlyWithWings extends FlyBehavior{
@Override
public void fly() {
System.out.print("Iam flying!");
}
}
public class Quack extends QuackBehavior{
@Override
public void quack() {
System.out.print("Quack\n");
}
}
public class Squeak extends QuackBehavior{
@Override
public void quack() {
System.out.print("Squeak");
}
}
原则3:多用组合,少用继承
利用接口将鸭子的变化与不变组合成superclass Duck
public abstract class Duck {
FlyBehavior mFlyBehavior;
QuackBehavior mQuackBehavior;
public Duck(){
}
public abstract void display();
public void performFly(){
mFlyBehavior.fly();
}
public void performQuack(){
mQuackBehavior.quack();
}
public void swim(){
System.out.print("Allducks float!!!");
}
}
创建subclass MallardDuck,继承自superclass Duck,这里,我们正在制造一个具体的Quack实现类的实例和一个FlyWithWings实现类的实例!违背了设计原则2,不针对实现编程。会在学习了其它模式后修改。
public class MallardDuck extends Duck {
public MallardDuck(){
mFlyBehavior = newFlyWithWings();
mQuackBehavior = newQuack();
}
@Override
public void display() {
System.out.print("I’ma real Mallard duck");
}
}
编译测试:
public class Simulator {
public static void main(String[] args)
{
Duck mallard = newMallardDuck();
mallard.performQuack();
mallard.performFly();
}
}
输出: