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)+"元");
}
}
}