軟件構架的精髓:設計模式(Design Partern)
Design Partern設計模式
一.設計模式原則:a.開閉原則(對擴展開放,修改關閉);
b.組合聚合復用原則(組合可選用功能)
c.接口隔離原則(防止接口過肥);
d.law of Remeter(抵米特法則,通過中間件對外訪問);
e.依賴倒轉原則(依賴接口);
f:the substitution of Lee(多態,向上轉型以父類出現);
二.主要模式:a.簡單工廠模式:主要利用抽象類可以很好的實現開閉原則.種類改變情況:
類: 1.public abstract class FruitFactory { public abstract Fruit creatFruit(); }
2.public class AppleFactory extends FruitFactory {
public Fruit creatFruit() { return new Apple(); } } //李式替代原則,向上轉型
3. public abstract class Fruit { public void display() { } }
4. public class Apple extends Fruit { public void display() {
System.out.println("this is apple"); } }
5.對外訪問: public class Client {
public static void main(String args[]) { FruitFactory ff=new AppleFactory();
Fruit apple=ff.creatFruit(); apple.display(); } } //向下轉型
b.工廠模式2(抽象工廠,種類不變,但分組改變的情況):
類: 1.public abstract class Factory {
public abstract Desk creatDesk(); public abstract Chair creatChair(); }
2. public class GlassFactory extends Factory {
public Desk creatDesk() { return new GlassDesk(); }
public Chair creatChair() { return new GlassChair(); } }
3. public abstract class Chair { public abstract void display(); }
4. public class GlassChair extends Chair {
public void display() { System.out.println("this is glassChair!"); }}
5.測試: public class Client { public static void main(String args[]) {
Factory fc=new GlassFactory(); Chair glasschair=fc.creatChair();
glasschair.display(); } } //向下轉型,以父類的名義調用所有方法
成員變量為static的時候立即開辟空間,但static方法在調用時才開辟空間,稱緩式初始化
c.單例模式:只產生一個實例連接:特點:a.實例保存在一個static成員變量里面
b.構造方法是private的,在外類不可new;c.通過static方法返回單例實例.
區別:a.餓汗模式在成員變量聲明時即對單例初始化
b.懶漢式在獲取實例的static方法中才對單例初始化,并對方法加synchronized
類.a.public class Singleton {
private static Singleton instance=new Singleton();
private Singleton(){ } //只留一個getInstance接口
public static Singleton getInstance(){ return instance; } }
b. public class SingletonLazy { //方法是個動作,可同時改變值,但static變量是空間
private static SingletonLazy instance; private SingletonLazy(){ }
public synchronized static SingletonLazy getInstance(){
if(instance==null) instance=new SingletonLazy(); return instance; }}
在外類中只可以通過如下調用: Singleton s=Singleton.getInstance();
d.適配器模式:
一.類適配器:1. public interface Target {
public void operator1(); public void operator2(); }
2.public class Adeptee {
public void operator1(){ System.out.println("this is Adeptee function");} }
3. public class Adepter extends Adeptee implements Target {//將所有方法放在適配器中
public void operator2() { System.out.println("this is new function"); }}
二.對象適配器public class Adepter2 implements Target {
private Adeptee adeptee; //通過組合思想,用有參構造方法
public Adepter2(Adeptee adeptee){ this.adeptee=adeptee; }
public void operator1(){ adeptee.operator1(); }
public void operator2(){ System.out.println("tagert function!");}}
e.裝飾模式
類:1。public abstract class Phone { public abstract void call(); }
2.public class NomalPhone extends Phone { //在不影響原有功能的基礎上進行擴展
public void call() { System.out.println("nomal phone!"); }}
3.public abstract class PhoneDecorator extends Phone { protected Phone phone;
public PhoneDecorator(Phone phone){ this.phone=phone; }
public void call() { } }
4. public class Mp3Phone extends PhoneDecorator {
public Mp3Phone(Phone phone) { super(phone); } //子類一定要先對父類初始化
private void mp3Phone(){ System.out.println("this is mp3phone!"); }
public void call() { phone.call( ); mp3Phone(); }}
5.測試:public class Client { public static void main(String args[]){
Phone mp3phone=new Mp3Phone(new NomalPhone()); mp3phone.call();
Phone allphone=new Mp3Phone(new PhotoPhone(new NomalPhone()));
allphone.call();}} (Photo.phone參數àDecoratoràPhoto.callàphone.call()àmp3.call)
備注:super只是用來初始化父類的構造方法,多態的方式是通過new得到身份的,與其他無關
f.命令模式:
類:1.public class ControlPanel { //命令傳遞者
private Command onComm;
public ControlPanel(Command onComm) { this.onComm=onComm; }
public void on() { onComm.handle(); }}
2. public abstract class Command { protected Television tv; //命令
public Command(Television tv){ this.tv=tv; }
public abstract void handle( ); }
3. public class TurnOn extends Command {
public TurnOn(Television tv) { super(tv); }
public void handle() { tv.open(); }}
4. public class Television{ public void open(){System.out.println("open!"); }//執行
5.調用:public class Client { public static void main(String args[]){
Television tv=new Television();
ControlPanel cp=new ControlPanel(new TurnOn(tv)); cp.on(); } }