1. 程式人生 > >UML面向物件的設計原則

UML面向物件的設計原則

UML面向物件的設計原則

里氏替換原則

不滿足LSP的方案

CS遊戲中的槍械類圖,士兵使用槍殺敵,具體用什麼槍,呼叫的時候才知道。有一種玩具手槍,增加一個類ToyGun,射不出子彈,業務呼叫類出現了問題。

 

Abstractgun抽象類

public abstract class Abstractgun {  //槍支抽象類

public Abstractgun() { } 

public abstract void shoot();  //槍用來射擊殺戮!

}

Handgun實現類

publicclassHandgun extends Abstractgun {  //手槍實現類

@Override               //手槍的特點是攜帶方便,射程短

public Handgun() { }

public void shoot() {

System.out.println("手槍射擊...");

}

}

ToyGun實現類

publicclassToyGun extends Abstractgun {  

@Override

public void shoot() { }         //玩具槍是不能射擊的,虛構

}

Soldier士兵類

publicclassSoldier {     

public Soldier() { }

public void kill(Abstractgun gun){

System.out.println("士兵開始殺人...");

gun.shoot();

}

}

測試程式碼:

            classProgram

            {

               static void Main(string[] args)

                {

                   Abstractgun handgun = new Handgun();

                   Abstractgun toygun = new Toygun();

                   //  AbstractToy toygun = newToyGun();//

                   Soldier soldier = new Soldier();

                    soldier.kill(handgun);

                   soldier.kill(toygun);

                   Console.ReadKey();

                }

            }

滿足LSP的設計方案

應用原則,改正如下:士兵拿著玩具槍來殺人, ToyGun脫離繼承,建立一個獨立的父類,為了做到程式碼可以複用,可以與Abastractgun建立依賴關係。

 

AbstractToy抽象類:

        public abstract class AbstractToy

        {

            public AbstractToy() {}

            public abstractvoid shoot();

        }

Toygun實現類

class Toygun : public Abstractgun, public AbstractToy{}

開閉原則

違反OCP開閉原則方案

BookStore 指的是書店,銷售小說書籍。書店新增加了一種書籍:計算機書籍,它不僅僅包含書籍名稱、作者、價格等資訊,還有一個獨特的屬性:面向的是什麼領域,也就是它的範圍(scope)。小說類 NovelBook 是一個具體的實現類,所有小說書籍的總稱。

滿足OCP開閉原則的方案

定義介面IBook ,定義了資料的三個方法:名稱、價格和作者。增加了一個介面 IComputerBook 和實現類ComputerBook,而 BookStore 不用做任何修改就可以完成書店銷售計算機書籍的業務。

 

IBook介面:

public interfaceIBook {

        public String getName();//書籍有名稱

        public int getPrice();//書籍有售價

        publicString getAuthor();//書籍有作者

}

IComputerBook介面:

public interfaceIComputerBook extends IBook{

    public String getScope();    //計算機書籍有一個範圍

}

ComputerBook實現類:

public classComputerBook implements IComputerBook {

    private String name;

    private String scope;

    private String author;

    private int price;

    public ComputerBook(String _name,int_price,String _author,String _scope){

        this.name=_name;

        this.price = _price;

        this.author = _author;

        this.scope = _scope;

    }

    public String getScope() {

        return this.scope;

    }

    public String getAuthor() {

        return this.author;

    }

    public String getName() {

        return this.name;

    }

    public int getPrice() {

        return this.price;

    }

}

NovelBook實現類:

public classNovelBook implements IBook {

       private String name; //書籍名稱

       private int price; //書籍的價格

       private String author; //書籍的作者

       public NovelBook(String _name,int_price,String _author){

        this.name = _name;

        this.price = _price;

        this.author = _author;

    }

       public String getAuthor() {  //獲得作者是誰

        return this.author;

    }

       public String getName() {  //書籍叫什麼名字

        return this.name;

    }

       public int getPrice() {   //獲得書籍的價格

        return this.price;

    }

}

測試程式碼:

importjava.text.NumberFormat;

importjava.util.ArrayList;

public classBookStore {

    private final static ArrayList<IBook>bookList = new ArrayList<IBook>();

    //靜態模組初始化,專案中一般是從持久層初始化產生

    static{

        bookList.add(new NovelBook("天龍八部",3200,"金庸"));

        bookList.add(new NovelBook("巴黎聖母院",5600,"雨果"));

        bookList.add(new NovelBook("悲慘世界",3500,"雨果"));

        bookList.add(new NovelBook("金瓶梅",4300,"蘭陵笑笑生"));

        //增加計算機書籍

        bookList.add(new ComputerBook("Thinkin Java",4300,"Bruce Eckel","程式語言"));

    }

    //模擬書店買書

    public static void main(String[] args) {

        NumberFormat formatter =NumberFormat.getCurrencyInstance();

        formatter.setMaximumFractionDigits(2);

        System.out.println("------------書店買出去的書籍記錄如下:---------------------");

        for(IBook book:bookList){

            System.out.println("書籍名稱:" + book.getName()+"\t書籍作者:" +

            book.getAuthor()+  "\t書籍價格:"  +  formatter.format(book.getPrice()/100.0)+"元");

        }

    }

}