if(config.isNetwork()) new XYZ().doNetworkAccess();
else new ABC().doDiskAccess();
这样可以,但是有点笨拙,我可以用这样的界面来简化它:
public interface Runnable
{
public void run();
}
public class ABC implements Runnable
{
public void run() {...}
}
public class XYZ implements Runnable
{
public void run() {...}
}
现在我的代码可以看起来像这样:
Runnable obj = config.isNetwork() ? new XYZ() : new ABC();
obj.run();
public class CartEntry
{
public float Price;
public int Quantity;
}
public class CartContents
{
public CartEntry[] items;
}
public class Order
{
private CartContents cart;
private float salesTax;
public Order(CartContents cart, float salesTax)
{
this.cart = cart;
this.salesTax = salesTax;
}
public float OrderTotal()
{
float cartTotal = 0;
for (int i = 0; i < cart.items.Length; i++)
{
cartTotal += cart.items[i].Price * cart.items[i].Quantity;
}
cartTotal += cartTotal*salesTax;
return cartTotal;
}
}
注意,OrderTotal方法(因此 Order 类)如何依赖于 CartContents和 CartEntry类的实现细节。如果我们试图更改这个逻辑以允许折扣,我们可能必须更改所有3个类。此外,如果我们改为使用 List<CartEntry>集合来跟踪项目,我们还必须改变 Order类。
现在有一个更好的方法来做同样的事情:
减少耦合例子:
public class CartEntry
{
public float Price;
public int Quantity;
public float GetLineItemTotal()
{
return Price * Quantity;
}
}
public class CartContents
{
public CartEntry[] items;
public float GetCartItemsTotal()
{
float cartTotal = 0;
foreach (CartEntry item in items)
{
cartTotal += item.GetLineItemTotal();
}
return cartTotal;
}
}
public class Order
{
private CartContents cart;
private float salesTax;
public Order(CartContents cart, float salesTax)
{
this.cart = cart;
this.salesTax = salesTax;
}
public float OrderTotal()
{
return cart.GetCartItemsTotal() * (1.0f + salesTax);
}
}
package interface_package.loose_coupling;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
A obja=new A();
B objb=new B();
obja.display(objb); //Calling display of A class with object of B class
}
}
说明:
在上面的例子中,我们有两个类 A 和 B
类 B 实现接口,即 InterfaceClass。
InterfaceClass 为 B 类定义了一个契约,因为 InterfaceClass 具有 B 类的抽象方法,任何其他类(例如 A)都可以访问这些方法。
在类 A 中,我们有一个显示方法,它可以除了实现 InterfaceClass 的类的对象(在我们的例子中是 B 类)。在类 A 的对象方法上调用类 B 的 display ()和 getVar ()
在 MainClass 中,我们创建了类 A 和类 B 的对象,并通过传递类 B 的对象即 obb 来调用 A 的显示方法。用 B 类对象调用 A 的显示方法。
现在说到松耦合。假设将来你必须将类 B 的名称改为 ABC,那么你就不必在类 B 的显示方法中改变它的名称,只需创建 new (ABC 类)的对象并将其传递给 MailClass 中的 display 方法。你不需要改变 A 类的任何东西