java2--里氏代换原则【例】

实现一个咖啡厅的点单系统

一杯咖啡+各种调料

使用面向对象的方法编程,并遵循开闭原则

//2012.8.1
//咖啡厅点单系统
public abstract class Beverage{               //咖啡的抽象类
	String name = "unknow";
	String description = "unknow";
	public String getDescription(){
		return description;	
	}
	public String getName(){
		return name;	
	}
	public abstract float cost();
};
class HouseBlend extends Beverage{       //咖啡--实例
	public HouseBlend(){
		name = "HouseBlend";
		description = "HouseBlend Coffee ";
	}	
	public float cost(){
		return 4.0f;	
	}	
};
class Espresso extends Beverage{
	public Espresso(){
		name = "Espresso";
		description = "Espresso Coffee ";
	}
	public float cost(){
		return 1.0f;	
	}	
};
class Decaf extends Beverage{
	public Decaf(){
		name = "Decaf";
		description = "Decaf Coffee ";
	}
	public float cost(){
		return 2.0f;	
	}	
};
class DarkRoast extends Beverage{
	public DarkRoast(){
		name = "DarkRoast";
		description = "DarkRoast Coffee ";
	}
	public float cost(){
		return 3.0f;	
	}	
};

public abstract class Condiment extends Beverage{       //调料的抽象类 继承咖啡抽象类
	public abstract float cost();
};
class Whip extends Condiment{     //调料---实例
	private Beverage beverage = null;
	private int num = 1;
	public Whip(Beverage temp){
		String name = "Whip";
		this.beverage = temp;	
	}
	public Whip(Beverage temp,int i){
		this(temp);
		this.num = i;	
	}
	public String getDescription(){
		return beverage.getDescription() + " + Whip";
	}
	public float cost(){
		return 0.1f*num + beverage.cost();	
	}
};
class Mocha extends Condiment{
	private Beverage beverage = null;
	private int num = 1;
	public Mocha(Beverage temp){
		String name = "Mocha";
		this.beverage = temp;	
	}
	public Mocha(Beverage temp,int i){
		this(temp);
		this.num = i;	
	}
	public String getDescription(){
		return beverage.getDescription() + " + Mocha";
	}
	public float cost(){
		return (0.15f*num + beverage.cost());	
	}
};

public class CoffeeDemo01{
	public static void main(String args[]){
		Beverage a = new Espresso();
		System.out.println("name:" + a.getName());
		Condiment b = new Mocha(a);
		b = new Whip(b);
		System.out.println(b.cost());
		System.out.println(b.getDescription());
	}	
}

由此实现点单系统,返回打印餐品和金额



Java中,设计模式里的两个重要的原则是“里氏替换原则”(Liskov Substitution Principle, LSP) 和 “依赖倒置原则”(Dependency Inversion Principle, DIP)。 **里氏替换原则(Liskov Substitution Principle)**: 这个原则强调的是子类必须能够替换其基类并仍然保持程序的正确性。如,假设有一个Animal接口和两个实现了它的子类Dog和Cat。如果代码期望接收任何Animal类型的实例并调用某种通用的行为(如`eat()`),那么使用Dog或Cat替换Animal是不会出现问题的。这是因为Dog和Cat都实现了eat方法并且符合动物的行为预期。 ```java interface Animal { void eat(); } class Dog implements Animal { @Override public void eat() { System.out.println("Dog is eating"); } } class Cat implements Animal { @Override public void eat() { System.out.println("Cat is eating"); } } ``` 在这个子中,你可以将Animal类型的数组放入Dog或Cat的对象,因为它们都是Animal的实例,不会违反LSP。 **依赖倒置原则(Dependency Inversion Principle)**: 它建议我们高层模块不应该依赖于低层模块,而是两者都应该依赖于抽象。如,如果你有一个游戏类Game依赖于具体的图形库Graphics,这违反了DIP。正确的做法是让Game依赖于图形接口IGraphics,然后由框架或配置负责实际选择哪种图形实现。 ```java interface IGraphics { void draw(); } class GraphicsImpl implements IGraphics { @Override public void draw() { // 具体图形处理逻辑 } } class Game { private IGraphics graphics; public Game(IGraphics graphics) { this.graphics = graphics; } public void play() { graphics.draw(); } } ``` 在这里,Game类只关心如何画图(通过依赖接口IGraphics),而不关心具体是如何实现的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值