6大设计原则(6):开闭原则

开闭原则是Java世界中最基本的设计原则,它指导我们如何建立一个稳定的、灵活的系统。

定义:

一个软件实体,如类、模块和函数,应该对扩展开放,对修改关闭。

 

什么意思呢?

就是你写的这个类,或者是接口、函数,当因需求发生变化而要进行修改的时候,不应该去修改原代码,而是对原代码进行扩展。

 

举个书店售书的栗子:

 

 

interface IBook {
	// 获得书名
	public String getName();

	// 获得价格
	public int getPrice();

	// 获得作者
	public String getAuthor();
}

// 小说类
class NovelBook implements IBook {

	private String name;
	private int price;
	private String author;

	public NovelBook(String name, int price, String author) {
		super();
		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;
	}

}

public class Client {

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

	static {
		BOOK_LIST.add(new NovelBook("天龙八部", 3200, "金庸"));
		BOOK_LIST.add(new NovelBook("巴黎圣母院", 5600, "雨果"));
		BOOK_LIST.add(new NovelBook("悲惨世界", 3500, "雨果"));
		BOOK_LIST.add(new NovelBook("金瓶梅", 4300, "兰陵笑笑生"));
	}

	public static void main(String[] args) {
		NumberFormat format = NumberFormat.getCurrencyInstance();
		format.setMaximumFractionDigits(2);
		System.out.println("-----书店卖出去的书籍记录如下:-----");
		for (IBook book : BOOK_LIST) {
			System.out.println("书籍名称:" + book.getName() + "\t书籍作者:"
					+ book.getAuthor() + "\t书籍价格:"
					+ format.format(book.getPrice() / 100.0) + "元");
		}
	}

}


 

需求有变化:所有40元以上的书9折出售,其他8折出售。

 

IBook作为接口应该是稳定可靠的,不应该经常发生变化。

 

修改实现类中的getPrice方法,这确实可以实现,但是却不符合开闭原则。

 

通过扩展实现变化:另写一个类 OffNovelBook继承NovelBook,复写getPrice方法。

 

class OffNovelBook extends NovelBook {

	public OffNovelBook(String name, int price, String author) {
		super(name, price, author);
	}

	@Override
	public int getPrice() {
		int selfPrice = super.getPrice();
		int offPrice = 0;
		if (selfPrice > 4000) {// 40以上9折
			offPrice = selfPrice * 90 / 100;
		} else {// 其他8折
			offPrice = selfPrice * 80 / 100;
		}

		return offPrice;
	}

}


 

场景类中的静态模块中做一下修改:

 

static {
		BOOK_LIST.add(new OffNovelBook("天龙八部", 3200, "金庸"));
		BOOK_LIST.add(new OffNovelBook("巴黎圣母院", 5600, "雨果"));
		BOOK_LIST.add(new OffNovelBook("悲惨世界", 3500, "雨果"));
		BOOK_LIST.add(new OffNovelBook("金瓶梅", 4300, "兰陵笑笑生"));
	}


 

 

开闭原则是一个非常虚的原则,前面5个原则是对开闭原则的具体解释,但却不局限于这5个原则。

 

你可能感兴趣的:(设计模式,6大设计原则)