『head first』学習ノートの一つ
『head first』学習ノート
せっけいげんり
第一の設計原則:
アプリケーションに変化が必要な可能性のある点を見つけ、独立して「カプセル化」し、変化を必要としないコードと混同しないでください.
例えば、Duckクラスのfly()とquack()の動作を独立させる.
2つ目の設計原則:
実装プログラミングではなく、インタフェースに対してプログラミングを行います.
flyとquackをそれぞれインタフェースとして設計し、Duckクラスはインタフェースを実装するのではなく、他のクラスを個別に製造してインタフェースを実装し、このクラスは「動作クラス」と呼ばれ、Duckクラスではなく動作クラスによって動作インタフェースを実現する.
せっけいげんり
第一の設計原則:
アプリケーションに変化が必要な可能性のある点を見つけ、独立して「カプセル化」し、変化を必要としないコードと混同しないでください.
例えば、Duckクラスのfly()とquack()の動作を独立させる.
2つ目の設計原則:
実装プログラミングではなく、インタフェースに対してプログラミングを行います.
flyとquackをそれぞれインタフェースとして設計し、Duckクラスはインタフェースを実装するのではなく、他のクラスを個別に製造してインタフェースを実装し、このクラスは「動作クラス」と呼ばれ、Duckクラスではなく動作クラスによって動作インタフェースを実現する.
package net.roky.pattern.first;
public interface FlyBehavior {
public void fly();
}
package net.roky.pattern.first;
public class Fly1 implements FlyBehavior {
public void fly(){
System.out.println("I can fly with wings.");
}
}
package net.roky.pattern.first;
public class Fly2 implements FlyBehavior {
public void fly() {
System.out.println("I can't fly.");
}
}
package net.roky.pattern.first;
public class Fly3 implements FlyBehavior {
public void fly() {
System.out.println("I can fly with rocket.");
}
}
package net.roky.pattern.first;
public interface QuackBehavior {
public void quack();
}
package net.roky.pattern.first;
public class Quack1 implements QuackBehavior {
public void quack() {
System.out.println("gaga...gaga..");
}
}
package net.roky.pattern.first;
public class Quack2 implements QuackBehavior{
public void quack(){
System.out.println("gugu...gugu...");
}
}
package net.roky.pattern.first;
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void setFlyBehavior(FlyBehavior f){
this.flyBehavior = f;
}
public void setQuackBehavior(QuackBehavior q){
this.quackBehavior = q;
}
public abstract void display();
public void swim(){
System.out.println("I'm a duck, I can swim.");
}
public void performFlyBehavior(){
flyBehavior.fly();
}
public void performQuackBehavior(){
quackBehavior.quack();
}
}
package net.roky.pattern.first;
public class Duck1 extends Duck{
public Duck1(){
System.out.println("Duck1....................");
super.flyBehavior = new Fly1();
super.quackBehavior = new Quack2();
}
public void display(){
System.out.println("------Duck1");
}
}
package net.roky.pattern.first;
public class Duck2 extends Duck {
public Duck2(){
System.out.println("Duck2....................");
super.flyBehavior = new Fly2();
super.quackBehavior = new Quack1();
}
public void display() {
System.out.println("------Duck2");
}
}
package net.roky.pattern.first;
public class Main {
public static void main(String[] args){
Duck duck = new Duck1();
duck.swim();
//
duck.performFlyBehavior();
duck.performQuackBehavior();
// setXXX
duck.setFlyBehavior(new Fly2());
duck.setQuackBehavior(new Quack2());
duck.performFlyBehavior();
duck.performQuackBehavior();
duck = new Duck2();
duck.swim();
//
duck.performFlyBehavior();
duck.performQuackBehavior();
// setXXX
duck.setFlyBehavior(new Fly3());
duck.setQuackBehavior(new Quack1());
duck.performFlyBehavior();
duck.performQuackBehavior();
}
}