拉面料理店中的装饰者设计模式
package july_Thirtieth.Decorator;
/**
* 被装饰抽象类——面
* 作用:当具体的被装饰类有多种时,抽象提出该抽象类,用于后面实现多态。
*/
public abstract class Noodle {
abstract void hardness();
abstract void soup();
abstract int price();
}
package july_Thirtieth.Decorator;
/**
* 具体的被装饰者类—— 客人lee的面类
* 继承抽象的被装饰者类,并实现其中的抽象方法。
*/
public class LeeNoodle extends Noodle{
@Override
void hardness() {
System.out.println("面");
}
@Override
void soup() {
System.out.println("汤");
}
@Override
int price() {
return 28;
}
}
package july_Thirtieth.Decorator;
/**
* 具体的被装饰者类—— 客人Moon的面类
* 继承抽象的被装饰者类,并实现其中的抽象方法。
*/
public class MoonNoodle extends Noodle {
@Override
void hardness() {
System.out.println("面");
}
@Override
void soup() {
System.out.println("汤");
}
@Override
int price() {
return 28;
}
}
package july_Thirtieth.Decorator;
/**
* 抽象装饰者类——菜单
* 要点:1.抽象装饰者类中继承该抽象类以保持接口规范
* 2.包含该抽象类的引用以通过多态的方式对多种被装饰者类进行装饰。
*/
public abstract class ChooseNoodle extends Noodle{
private Noodle noodle;
public ChooseNoodle(Noodle noodle) {
this.noodle = noodle;
}
@Override
void hardness() {
noodle.hardness();
}
@Override
void soup() {
noodle.soup();
}
@Override
int price() {
return noodle.price();
}
}
package july_Thirtieth.Decorator;
/**
* 可以加入的小料
*/
public interface NoodleDecorate {
default void onion(){
System.out.print("加葱");
}
default void chili(){
System.out.println("加辣椒");
}
default void garlic(){
System.out.println("加蒜");
}
default void parsley(){
System.out.println("加香菜");
}
}
package july_Thirtieth.Decorator;
/**
* 装饰者类 猪豚骨面
*/
public class PigNoodle extends ChooseNoodle implements NoodleDecorate{
public PigNoodle(Noodle noodle) {
super(noodle);
}
@Override
void hardness() {
System.out.print("特硬");
super.hardness();
}
@Override
void soup() {
System.out.println("豚骨");
super.soup();
}
@Override
int price() {
return super.price() + 10;
}
}
package july_Thirtieth.Decorator;
/**
* 装饰者类 红烧牛肉面
*/
public class BeefNoodle extends ChooseNoodle implements NoodleDecorate{
public BeefNoodle(Noodle noodle) {
super(noodle);
}
@Override
void hardness() {
System.out.print("软");
super.hardness();
}
@Override
void soup() {
System.out.print("冬阴功牛肉");
super.soup();
}
@Override
int price() {
return super.price() + 15;
}
}
package july_Thirtieth.Decorator;
public class NoodleTest {
public static void main(String[] args) {
// 客人Lee点了一份牛肉面
final BeefNoodle beefNoodle = new BeefNoodle(new LeeNoodle());
final int price = beefNoodle.price();
System.out.print("Lee点的面是: ");
beefNoodle.soup();
beefNoodle.onion();
beefNoodle.chili();
System.out.println(price);
// 客人Moon点了一份牛肉面
final BeefNoodle beefNoodle1 = new BeefNoodle(new MoonNoodle());
System.out.println(beefNoodle1.price());
// 客人Lee又点了一份猪肉面
final PigNoodle pigNoodle = new PigNoodle(new LeeNoodle());
System.out.println(pigNoodle.price());
}
}
版权声明:本文为m0_47349308原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。