//我们用动物生活来做测试 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) + "元"); } } }结果展示: