闽公网安备 35020302035485号
组合复用原则:在软件设计中,尽量使用组合/聚合而不是继承达到代码复用的目的。



public class TestA {
public void fun(int a,int b){
System.out.println(a+"+"+b+"="+(a+b));
}
public static void main(String[] args) {
System.out.println("父类的运行结果");
TestA a=new TestA();
a.fun(1,2);
// 堆代码 duidaima.com
//父类存在的地方,可以用子类替代
//子类B替代父类A
System.out.println("子类替代父类后的运行结果");
TestB b=new TestB();
b.fun(1,2);
}
}
class TestB extends TestA{
@Override
public void fun(int a, int b) {
System.out.println(a+"-"+b+"="+(a-b));
}
}
大家肯定也都能猜出来结果是什么样子的:public class TestA {
public void fun(int a,int b){
System.out.println(a+"+"+b+"="+(a+b));
}
public static void main(String[] args) {
System.out.println("父类的运行结果");
TestA a=new TestA();
a.fun(1,2);
//父类存在的地方,可以用子类替代
//子类B替代父类A
System.out.println("子类替代父类后的运行结果");
TestB b=new TestB();
b.fun(1,2);
b.newFun();
}
}
class TestB extends TestA{
public void newFun(){
System.out.println("这是子类的新方法...");
}
}
这次运行出来的代码结果就是我们意料中的内容了:Process finished with exit code 0
class BeijingShop implements Shop{
public String sell(){
return "北京商店售卖:北京烤鸭,稻香村月饼";
}
}
class ShanDongShop implements Shop{
@Override
public String sell() {
return "山东商店售卖:德州扒鸡,烟台苹果";
}
}
//如果说顾客去购买商品
class Customer{
public void shopping(ShanDongShop shop){
//购物
System.out.println(shop.sell());
}
}
//这是在山东商店购买,如果说是在北京商店购买就会这样
class Customer{
public void shopping(BeijingShop shop) {
//购物
System.out.println(shop.sell());
}
}
这也是这种设计的存在缺陷,顾客每更换一家商店,都要修改一次代码,这明显违背了开闭原则。存在以上缺点的原因是:顾客类设计时同具体的商店类绑定了,这违背了依赖倒置原则。解决方式我们可以定义一个共同的接口Shop,就可以这样了。public class TestSale {
public static void main(String[] args) {
Customer c = new Customer();
System.out.println("---顾客购买商品如下---");
c.shopping(new ShanDongShop());
c.shopping(new BeijingShop());
}
}
interface Shop{
//售卖方法
public String sell();
}
class BeijingShop implements Shop{
public String sell(){
return "北京商店售卖:北京烤鸭,稻香村月饼";
}
}
class ShanDongShop implements Shop{
@Override
public String sell() {
return "山东商店售卖:德州扒鸡,烟台苹果";
}
}
class Customer{
public void shopping(Shop shop) {
System.out.println(shop.sell());//购物
}
}
程序运行结果:Process finished with exit code 0
这样,不管顾客类 Customer 访问什么商店,或者增加新的商店,都不需要修改原有代码了。
(完)