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