设计模式的目的是为了提高代码重用性、可读性、可扩展性、可靠性,使得程序呈现出高内聚、低耦合的特性。
我们在设计一些设计模式时,一般遵循如下七项基本原则,它们分别是:
单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点。
简单说明一下,首先我们可以对某个类来说,即一个类应该只负责一项职责。如类A负责两个不同职责: 职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2。
以下假设一个场景并用代码演示(项目代码名称为SRP):
有一个鸟类,它会飞翔,用一个类描述鸟类飞行这个场景:
创建类Fly.java,代码如下:
public class Fly {public void birds(String birds){System.out.println(birds + "会在空中飞翔");}
}
创建运行类Client.java,代码如下:
public class Client{public static void main(String[] args){Fly fly = new Fly();fly.birds("老鹰");fly.birds("猫头鹰");fly.birds("喜鹊");}
}
运行结果如下所示:
老鹰会在空中飞翔
猫头鹰会在空中飞翔
喜鹊会在空中飞翔
在后来发现新问题,并不是所有的鸟类都会飞翔的,比如企鹅就不会了,修改时如果遵循单一职责原则的话,那么需要添加一个类
创建类NoFly.java,代码如下:
public class NoFly {public void birds(String birds){System.out.println("\n");System.out.println(birds + "不会在空中飞翔");}
}
修改运行类Client.java,代码如下:
public class Client{public static void main(String[] args){Fly fly = new Fly();fly.birds("老鹰");fly.birds("猫头鹰");fly.birds("喜鹊");NoFly noFly = new NoFly();noFly.birds("企鹅");}
}
运行结果如下所示:
老鹰会在空中飞翔
猫头鹰会在空中飞翔
喜鹊会在空中飞翔企鹅不会在空中飞翔
开放封闭原则就是软件实体应该对扩展开放,而对修改封闭。开放封闭原则是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化,降低耦合,而开放封闭原则正是对这一目标的最直接体现。
开放封闭原则主要体现在两个方面:
如果一个软件能够满足 OCP 原则,那么它将有以下两项优点:
开闭原则的实现方法
以下假设一个场景并用代码演示(项目代码名称为OCP):
以商场卖东西为例:
创建类shopping.java,代码如下:
public class Shopping {public static void main(String[] args) {Shop shopping = new Shop();shopping.shop(new Apple());shopping.shop(new Pear());shopping.shop(new Watermelon());}
}class Shop {public void shop(Type s) {if (s.type == 1) {apple(s);} else if (s.type == 2) {pear(s);} else if (s.type == 3) {watermelon(s);}}//出售苹果public void apple(Type r) {System.out.println(" 出售苹果 ");}//出售梨public void pear(Type r) {System.out.println(" 出售梨 ");}//出售西瓜public void watermelon(Type r) {System.out.println(" 出售西瓜 ");}
}class Type {int type;
}class Apple extends Type {Apple() {super.type = 1;}
}class Pear extends Type {Pear() {super.type = 2;}
}class Watermelon extends Type {Watermelon() {super.type = 3;}}
运行结果如下所示:
出售苹果 出售梨 出售西瓜
修改代码,改为用OCP原则:
创建代码ShoppingOCP.java,代码如下:
public class ShoppingOCP {public static void main(String[] args) {ShopOCP shopping = new ShopOCP();shopping.shop(new Apple1());shopping.shop(new Pear1());shopping.shop(new Watermelon1());shopping.shop(new Cherry1());}
}class ShopOCP {public void shop(Type1 s) {s.type1();}
}abstract class Type1 {abstract void type1();
}class Apple1 extends Type1 {@Overridevoid type1() {System.out.println(" 出售苹果 ");}
}class Pear1 extends Type1 {@Overridevoid type1() {System.out.println(" 出售梨 ");}
}class Watermelon1 extends Type1 {@Overridevoid type1() {System.out.println(" 出售西瓜 ");}
}class Cherry1 extends Type1 {@Overridevoid type1() {System.out.println(" 出售樱桃 ");}
}
运行结果如下所示:
出售苹果 出售梨 出售西瓜 出售樱桃
把创建Type1 类做成抽象类,并提供一个抽象的 type方法,让子类去实现即可,这样我们有新的水果种类时,只需要让新的水果类继承 Type1 ,并实现 type方法即可,使用方的代码就不需要修改了, 从而满足了开闭原则。
以上代码下载请点击该链接:https://github.com/Yarrow052/Java-package.git