UML面向对象的设计原则

    xiaoxiao2021-12-14  49

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

            }

        }

    }

    转载请注明原文地址: https://ju.6miu.com/read-970136.html

    最新回复(0)