UML面向对象的设计原则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tingary/article/details/53445241

UML面向对象的设计原则

里氏替换原则

不满足LSP的方案

CS游戏中的枪械类图,士兵使用枪杀敌,具体用什么枪,调用的时候才知道。有一种玩具手枪,增加一个类ToyGun,射不出子弹,业务调用类出现了问题。

 

Abstractgun抽象类

public abstract class Abstractgun {  //枪支抽象类

public Abstractgun() { } 

public abstract void shoot();  //枪用来射击杀戮!

}

Handgun实现类

扫描二维码关注公众号,回复: 4655259 查看本文章

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

        }

    }

}


猜你喜欢

转载自blog.csdn.net/tingary/article/details/53445241