设计模式 - 开闭原则
即 对立与统一原则java
软件实体应该对扩展开放,对修改关闭,即实体应当经过扩展实现变化,而不是修改代码实现变化git
什么是软件实体,项目或软件中按照必定逻辑规划划分的模块
抽象 类
方法
书店销售书籍数据库
而后书写代码以下编程
// 书籍接口 public interface Ibook{ // 名称 public String getName(); // 售价 public int getPrice(); // 做者 public String getAuthor(); }
书店出售小说类书籍,书写代码设计模式
public class NoveIBook implements IBook { // 名称 private String name; // 价格 private int price; // 做者 private String author; // 构造函数 public NoveIBook(String _name, int _price, String _author){ this.name = _name; this.price = _price; this.author = _author; } // 得到做者 public String getAuthor(){ return this.author; } // 价格 public String getPrice(){ return this.price; } // 名字 public String getName(){ return this.name; } }
其中,价格定义为int,不是错误,非金融类项目,取两位精度,运算过程当中,扩大100倍,展现时缩小100倍。
售书架构
public class BookStore { private final static ArrayList bookList = new ArrayList(); // 下发的内容,是放置在持久层,即保存到硬盘中的 // java的三层架构为视图层,服务层,持久层。 // view 层 用于接收用户提交的请求代码 // service 系统的业务逻辑 // dao 持久层,操做数据库代码 // 上下层,经过接口联系 static{ bookList.add(new NoveIBook("", 3200, "")); } // 买书 public static void main(String[] args){ // 大数格式化 NumberFormat formatter = NumberFormat.getCurrencyInstance(); formatter.setMaximumFractionDigits(2); for(IBook book:bookList){ System.out.println(book.getName() + book.getPrice() + book.getAuthor()); } } }
而后,发生打折。
修改接口
接口不该该修改,由于接口是持久的
修改实现类
修改getPrice()方法达到打折的目的。
可是,由于采购书籍的人,要看到实现的价格。因此不修改
扩展实现
再增长一个子类,以下编程语言
代码以下ide
// 打折销售的小说 public class OffNovelBook extends NoveIBook { public OffNoveIBook(String _name, int _price, String _author){ super(_name, _price, _author); } // 覆盖销售 @Override public int getPrice(){ return super.getPrice()*90 / 100; } }
接着修改main里面的内容便可。函数
变化分为逻辑变化,子模块变化,可见视图变化。this
抽象约束对一组事物的描述。
当商店增长了一个计算机书籍的销售。可是计算机书籍还有不少种,有编程语言,数据库等。
// 增长计算机书籍接口 public interface IComputerBook extends IBook{ // 计算机书籍 public String getScope(); // 计算机书籍的范围 }
一样的,书写计算机书籍类
public class ComputerBook implements IComputerBook{ private String name; private String scope; private String author; 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 getName(){ return this.name; } public int getPrice(){ return this.price; } }
直接在main中添加便可。
总结 ; 对扩展开放,前提对抽象约束。
即,使用配置参数,控制模块行为。
类的职责要单一
里氏替换原则不能破坏继承
即,子类对象,能够代替超类。
面向接口。
即,每一个接口只负责干一件事。
每一个接口只干一件事
通讯经过类之间通讯。二者之间耦合度越少越好。 ## 开闭原则 对扩展开放,对修改关闭