zoukankan      html  css  js  c++  java
  • 设计模式:开闭原则

    640?wx_fmt=jpeg

    1、定义

    开闭原则,对于扩展是开放的,对于修改是关闭。

    640?wx_fmt=other

    OCP_Diagram.png

    2、实现

    (1)创建书籍接口

    interface IBook {

    String getName();

    int getPrice();

    String getAuthor();
    }

    (2)创建计算机书籍接口

    interface IComputerBook extends IBook {

    public String getScope();
    }

    (3)实现小说类


    class NovelBook 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;
    }

    @Override
    public String getName() {
    return name;
    }

    @Override
    public int getPrice() {
    return price;
    }

    @Override
    public String getAuthor() {
    return author;
    }
    }

    (4)实现计算机书籍类


    class ComputerBook implements IComputerBook {

    private String name;

    private int price;

    private String author;

    private String scope;

    public ComputerBook(String name, int price, String author, String scope) {
    this.name = name;
    this.price = price;
    this.author = author;
    this.scope = scope;
    }

    @Override
    public String getName() {
    return name;
    }

    @Override
    public int getPrice() {
    return price;
    }

    @Override
    public String getScope() {
    return scope;
    }

    @Override
    public String getAuthor() {
    return author;
    }
    }

    (4)实现书店类

    class BookStore {

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

    static {
    sBookList.add(new NovelBook("天龙八部", 3200, "金庸"));
    sBookList.add(new NovelBook("巴黎圣母院", 5600, "雨果"));
    sBookList.add(new NovelBook("悲催世界", 3500, "雨果"));
    sBookList.add(new NovelBook("金瓶梅", 4300, "兰陵笑笑生"));
    sBookList.add(new ComputerBook("Think in Java", 5800, "Bruce Eckel", "编程语言"));
    }

    public static void main(String[] args) throws IOException {
    NumberFormat format = NumberFormat.getCurrencyInstance();
    format.setMaximumFractionDigits(2);
    Log.d("JimmyZhang", "----书店卖出去的书籍记录如下---");
    for (IBook book : sBookList) {
    Log.d("JimmyZhang", "书籍名称:" + book.getName()
    + " 书籍作者:" + book.getAuthor()
    + " 书籍价格:" + format.format(book.getPrice() / 100.00) + "元");
    }
    }

    }

    3、原则

    (1)通过接口或抽象类约束扩展,对扩展进行边界限定;
    (2)参数类型、引用对象尽量使用接口或者抽象类,而不是实现类;
    (3)抽象层尽量保持稳定,一旦确定就不允许修改;
    (4)将相同的变化封装在一个接口或抽象类中;
    (5) 将不同的变化封装到不同的接口或抽象类中。

    4、总结

    (1)单一职责原则要求实现类要职责单一;
    (2)里氏替换原则要求不要去破坏继承系统;
    (3)依赖倒置原则要求面向接口编程;
    (4) 接口隔离原则要求在设计接口的时候要精简单一;
    (5) 迪米特法则要求要降低耦合;
    (6)开闭原则是总纲,要求对扩展开发,对修改关闭。


  • 相关阅读:
    jdbc和DBeaver客户端连接oracle很慢,初始化连接成功后速度正常
    centos7中vncserver连接失败
    postgres数据库建库、修改owner
    nested exception is org.apache.ibatis.binding.BindingException:
    postgresql导出表insert方式数据
    解决ecllipse注释模板不生效问题
    postgresql 修改表属性,包括新增、修改、删除列
    ssh本机可登陆远端服务器,但远端服务器无法登陆本机
    linux源码安装后,设置动态库路径和环境变量
    valgrind跟踪调试动态库*.so
  • 原文地址:https://www.cnblogs.com/hgmyz/p/12350898.html
Copyright © 2011-2022 走看看