java 装饰者模式

    xiaoxiao2024-03-26  117

    java 装饰者模式

    java 装饰者模式是什么?实例如下:

    java 装饰者模式是什么?

    装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

    实例如下:

    // 披萨实例 abstract class Pizza { // 披萨 String description = "Basic Pizza"; // 描述内容 public String getDescription() { // 获取描述 return description; } public abstract double cost(); // 计费 } class ThickcrustPizza extends Pizza { // 厚皮比萨 public ThickcrustPizza() { description = "Thick crust pizza, with tomato sauce"; // 构造器初始化,也可以设置一个费用变量在这里初始化 } public double cost() { return 7.99; } } class ThincrustPizza extends Pizza { // 薄皮披萨 public ThincrustPizza() { description = "Thin crust pizza, with tomato sauce"; // 构造器初始化,下面的装饰也可以这样初始化,可以省去方法 } public double cost() { return 7.99; } } abstract class ToppingDecorator extends Pizza { // 顶部装饰器 Pizza pizza; public abstract String getDescription(); } class Olives extends ToppingDecorator { // 橄榄 public Olives( Pizza pizza ) { this.pizza = pizza; } public String getDescription() { return pizza.getDescription() + ", Olives"; } public double cost() { return pizza.cost() + .30; } } class Cheese extends ToppingDecorator { // 奶酪 public Cheese( Pizza pizza ) { this.pizza = pizza; } public String getDescription() { return pizza.getDescription() + ", Cheese"; } public double cost() { return pizza.cost(); // cheese is free } } class PizzaStore { // 披萨店 public static void main( String args[] ) { Pizza pizza = new ThincrustPizza(); // 薄皮披萨 Pizza cheesePizza = new Cheese( pizza ); // 加上奶酪 Pizza greekPizza = new Olives( cheesePizza ); // 再加橄榄 System.out.println( greekPizza.getDescription() + " $" + greekPizza.cost() ); } } public class Test0525{ // 测试 public static void main( String[] args ){ PizzaStore.main( args ); } } ------------------------------------------------------------------------- E:\java>java Test0525 Thin crust pizza, with tomato sauce, Cheese, Olives $8.290000000000001 // 星巴克咖啡 abstract class Beverage { // 饮料 String description = "Unknown Beverage"; public String getDescription() { return description; } public abstract double cost(); } class Decaf extends Beverage { // 无咖啡因咖啡 public Decaf() { description = "Decaf Coffee"; } public double cost() { return 1.05; } } class Espresso extends Beverage { // 浓咖啡 public Espresso() { description = "Espresso"; } public double cost() { return 1.99; } } class HouseBlend extends Beverage { // 家庭混合咖啡 public HouseBlend() { description = "House Blend Coffee"; } public double cost() { return .89; } } class DarkRoast extends Beverage { // 黑咖啡 public DarkRoast() { description = "Dark Roast Coffee"; } public double cost() { return .99; } } abstract class CondimentDecorator extends Beverage { // 调味品装饰 Beverage beverage; public abstract String getDescription(); } class Milk extends CondimentDecorator { // 鲜奶 public Milk( Beverage beverage ) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Milk"; } public double cost() { return .10 + beverage.cost(); } } class Mocha extends CondimentDecorator { // 摩卡 public Mocha( Beverage beverage ) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Mocha"; } public double cost() { return .20 + beverage.cost(); } } class Soy extends CondimentDecorator { // 酱油 public Soy( Beverage beverage ) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Soy"; } public double cost() { return .15 + beverage.cost(); } } class Whip extends CondimentDecorator { // 稀奶油 public Whip( Beverage beverage ) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Whip"; } public double cost() { return .10 + beverage.cost(); } } class StarbuzzCoffee { // 星巴克咖啡 public static void main( String args[] ) { Beverage beverage = new Espresso(); // 浓咖啡 System.out.println( beverage.getDescription() + " $" + beverage.cost() ); Beverage beverage2 = new DarkRoast(); // 黑咖啡 beverage2 = new Mocha( beverage2 ); // 加上摩卡 beverage2 = new Mocha( beverage2 ); // 再加摩卡 beverage2 = new Whip( beverage2 ); // 再加稀奶 System.out.println( beverage2.getDescription() + " $" + beverage2.cost() ); Beverage beverage3 = new HouseBlend(); // 混合咖啡 beverage3 = new Soy( beverage3 ); // 加上酱油 beverage3 = new Mocha( beverage3 ); // 加上摩卡 beverage3 = new Whip( beverage3 ); // 再加稀奶 System.out.println( beverage3.getDescription() + " $" + beverage3.cost() ); Beverage beverage4 = new Whip( new Mocha( new Soy( new HouseBlend() ) ) ); // beverage3的另一种写法。 System.out.println( beverage4.getDescription() + " $" + beverage4.cost() ); } } public class Test0525{ // 测试 public static void main( String[] args ){ StarbuzzCoffee.main( args ); } } ------------------------------------------------------ E:\java>java Test0525 Espresso $1.99 Dark Roast Coffee, Mocha, Mocha, Whip $1.49 House Blend Coffee, Soy, Mocha, Whip $1.34 House Blend Coffee, Soy, Mocha, Whip $1.34 enum Size { TALL, GRANDE, VENTI }; // 加入尺寸属性 abstract class Beverage { // 饮料 Size size = Size.TALL; String description = "Unknown Beverage"; public String getDescription() { return description; } public void setSize( Size size ) { this.size = size; } public Size getSize() { return this.size; } public abstract double cost(); } class DarkRoast extends Beverage { public DarkRoast() { description = "Dark Roast Coffee"; } public double cost() { return .99; } } class Decaf extends Beverage { public Decaf() { description = "Decaf Coffee"; } public double cost() { return 1.05; } } class Espresso extends Beverage { public Espresso() { description = "Espresso"; } public double cost() { return 1.99; } } class HouseBlend extends Beverage { public HouseBlend() { description = "House Blend Coffee"; } public double cost() { return .89; } } abstract class CondimentDecorator extends Beverage { public Beverage beverage; public abstract String getDescription(); public Size getSize() { return beverage.getSize(); } } class Milk extends CondimentDecorator { public Milk( Beverage beverage ) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Milk"; } public double cost() { return beverage.cost() + .10; } } class Mocha extends CondimentDecorator { public Mocha( Beverage beverage ) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Mocha"; } public double cost() { return beverage.cost() + .20; } } class Soy extends CondimentDecorator { public Soy( Beverage beverage ) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Soy"; } public double cost() { double cost = beverage.cost(); if ( beverage.getSize() == Size.TALL ) { cost += .10; } else if ( beverage.getSize() == Size.GRANDE ) { cost += .15; } else if ( beverage.getSize() == Size.VENTI ) { cost += .20; } return cost; } } class Whip extends CondimentDecorator { public Whip( Beverage beverage ) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Whip"; } public double cost() { return beverage.cost() + .10; } } class StarbuzzCoffee { public static void main( String args[] ) { Beverage beverage = new Espresso(); System.out.println( beverage.getDescription() + " $" + String.format( "%.2f", beverage.cost() ) ); Beverage beverage2 = new DarkRoast(); beverage2 = new Mocha( beverage2 ); beverage2 = new Mocha( beverage2 ); beverage2 = new Whip( beverage2 ); System.out.println( beverage2.getDescription() + " $" + String.format( "%.2f", beverage2.cost() ) ); Beverage beverage3 = new HouseBlend(); beverage3.setSize( Size.VENTI ); beverage3 = new Soy( beverage3 ); beverage3 = new Mocha( beverage3 ); beverage3 = new Whip( beverage3 ); System.out.println( beverage3.getDescription() + " $" + String.format( "%.2f", beverage3.cost() ) ); } } public class Test0525{ public static void main( String[] args ){ StarbuzzCoffee.main( args ); } } --------------------------------------------- E:\java>java Test0525 Espresso $1.99 Dark Roast Coffee, Mocha, Mocha, Whip $1.49 House Blend Coffee, Soy, Mocha, Whip $1.39 import java.io.*; class LowerCaseInputStream extends FilterInputStream { public LowerCaseInputStream( InputStream in ) { super( in ); } public int read() throws IOException { int c = in.read(); return ( c == -1 ? c : Character.toLowerCase( (char) c ) ); } public int read( byte[] b, int offset, int len ) throws IOException { int result = in.read( b, offset, len ); for ( int i = offset; i < offset+result; i ++ ) { b[i] = ( byte )Character.toLowerCase( (char) b[i] ); } return result; } } class InputTest { public static void main( String[] args ) throws IOException { // try-catch的二种不同语法,效果一样。 int c; InputStream in = null; try { // 以前的,手动释放资源。 in = new LowerCaseInputStream( new BufferedInputStream( new FileInputStream( "Test0609.java" ) ) ); while( (c = in.read()) >= 0 ) System.out.print( (char) c ); } catch ( IOException e ) { e.printStackTrace(); } finally { if ( in != null ) { in.close(); } } System.out.println(); // java 7 以后可以带若干参数,结尾自动调用参数close()方法释放资源。 try ( InputStream in2 = new LowerCaseInputStream( new BufferedInputStream( new FileInputStream( "Test0609.java" ) ) ) ) { while( (c = in2.read()) >= 0) System.out.print( (char) c ); } catch ( IOException e ) { e.printStackTrace(); } } } public class Test0609{ public static void main( String[] args )throws IOException{ InputTest.main( args ); } } -------------------------------- // 打印文件Test0609.java内容二遍。
    最新回复(0)