闽公网安备 35020302035485号
//我们用动物生活来做测试
class Animal{
public void breathe(String animal){
System.out.println(animal+"生活在陆地上");
}
}
public class Client{
public static void main(String[] args){
Animal animal = new Animal();
animal.breathe("羊");
animal.breathe("牛");
animal.breathe("猪");
}
}
运行结果:猪生活在陆地上
class Terrestrial{
public void breathe(String animal){
System.out.println(animal+"生活在陆地上");
}
}
class Aquatic{
public void breathe(String animal){
System.out.println(animal+"生活在水里");
}
}
public class Client{
public static void main(String[] args){
Terrestrial terrestrial = new Terrestrial();
terrestrial.breathe("羊");
terrestrial.breathe("牛");
terrestrial.breathe("猪");
// 堆代码 duidaima.com
Aquatic aquatic = new Aquatic();
aquatic.breathe("鱼");
}
}
运行结果:鱼生活在水里
class Animal{
public void breathe(String animal){
if("鱼".equals(animal)){
System.out.println(animal+"生活在水中");
}else{
System.out.println(animal+"生活在陆地上");
}
}
}
public class Client{
public static void main(String[] args){
Animal animal = new Animal();
animal.breathe("羊");
animal.breathe("牛");
animal.breathe("猪");
animal.breathe("鱼");
}
}
可以看到,这种修改方式要简单的多。但是却存在着隐患:有一天需要将鱼分为生活在淡水中的鱼和生活在海水的鱼,则又需要修改 Animal 类的 breathe 方法,而对原有代码的修改会对调用“猪”“牛”“羊”等相关功能带来风险,也许某一天你会发现程序运行的结果变为“牛生活在水中”了。这种修改方式直接在代码级别上违背了单一职责原则,虽然修改起来最简单,但隐患却是最大的。还有一种修改方式:class Animal{
public void breathe(String animal){
System.out.println(animal+"生活在陆地上");
}
public void breathe2(String animal){
System.out.println(animal+"生活在水中");
}
}
public class Client{
public static void main(String[] args){
Animal animal = new Animal();
animal.breathe("牛");
animal.breathe("羊");
animal.breathe("猪");
animal.breathe2("鱼");
}
}
可以看到,这种修改方式没有改动原来的方法,而是在类中新加了一个方法,这样虽然也违背了单一职责原则,但在方法级别上却是符合单一职责原则的,因为它并没有动原来方法的代码。这三种方式各有优缺点,那么在实际编程中,采用哪一中呢?其实这真的比较难说,需要根据实际情况来确定。我的原则是:只有逻辑足够简单,才可以在代码级别上违反单一职责原则;只有类中方法数量足够少,才可以在方法级别上违反单一职责原则;
//书店卖书
interface Books{
//书籍名称
public Sting getName();
//书籍价格
public int getPrice();
//书籍作者
public String getAuthor();
}
public class NovelBook implements Books {
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;
}
}
以上的代码是数据的实现类和书籍的类别;public class BookStore {
private final static ArrayList<Books> sBookList = new ArrayList<Books>();
static {
sBookList.add(new NovelBook("天龙八部", 4400, "金庸"));
sBookList.add(new NovelBook("射雕英雄传", 7600, "金庸"));
sBookList.add(new NovelBook("钢铁是怎么炼成的", 7500, "保尔·柯查金"));
sBookList.add(new NovelBook("红楼梦", 3300, "曹雪芹"));
}
public static void main(String[] args) throws IOException {
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setMaximumFractionDigits(2);
System.out.println("----书店卖出去的书籍记录如下---");
for (Books book : sBookList) {
System.out.println("书籍名称:" + book.getName()
+ "\t书籍作者:" + book.getAuthor()
+ "\t书籍价格:" + format.format(book.getPrice() / 100.00) + "元");
}
}
}
运行结果如下:D:\develop\JDK8\jdk1.8.0_181\bin\java.exe "-javaagent:D:\develop\IDEA\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=62787:D:\develop\IDEA\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath D:\develop\JDK8\jdk1.8.0_181\jre\lib\charsets.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\deploy.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\dnsns.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\jaccess.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\localedata.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\nashorn.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\sunec.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\ext\zipfs.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\javaws.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\jce.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\jfr.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\jfxswt.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\jsse.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\management-agent.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\plugin.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\resources.jar;D:\develop\JDK8\jdk1.8.0_181\jre\lib\rt.jar;D:\develop\IDEA_Workspace\CloudCode\out\production\PattemMoudle com.yldyyn.test.BookStore ----书店卖出去的书籍记录如下--- 书籍名称:天龙八部 书籍作者:金庸 书籍价格:¥44.00元 书籍名称:射雕英雄传 书籍作者:金庸 书籍价格:¥76.00元 书籍名称:钢铁是怎么炼成的 书籍作者:保尔·柯查金 书籍价格:¥75.00元 书籍名称:红楼梦 书籍作者:曹雪芹 书籍价格:¥33.00元 Process finished with exit code 0但是如果说现在书店卖书的时候要求打折出售,40以上的我们要7折售卖,40以下的我们打8折。
public class OnSaleBook extends NovelBook {
public OnSaleBook(String name, int price, String author) {
super(name, price, author);
}
@Override
public String getName() {
return super.getName();
}
@Override
public int getPrice() {
int OnsalePrice = super.getPrice();
int salePrce = 0;
if (OnsalePrice >4000){
salePrce = OnsalePrice * 70/100;
}else{
salePrce = OnsalePrice * 80/100;
}
return salePrce;
}
@Override
public String getAuthor() {
return super.getAuthor();
}
}
上面的代码是扩展出来的一个类,而不是在原来的类中进行的修改。public class BookStore {
private final static ArrayList<Books> sBookList = new ArrayList<Books>();
static {
sBookList.add(new OnSaleBook("天龙八部", 4400, "金庸"));
sBookList.add(new OnSaleBook("射雕英雄传", 7600, "金庸"));
sBookList.add(new OnSaleBook("钢铁是怎么炼成的", 7500, "保尔·柯查金"));
sBookList.add(new OnSaleBook("红楼梦", 3300, "曹雪芹"));
}
public static void main(String[] args) throws IOException {
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setMaximumFractionDigits(2);
System.out.println("----书店卖出去的书籍记录如下---");
for (Books book : sBookList) {
System.out.println("书籍名称:" + book.getName()
+ "\t书籍作者:" + book.getAuthor()
+ "\t书籍价格:" + format.format(book.getPrice() / 100.00) + "元");
}
}
}
结果展示: