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();
}
}
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() ) ) );
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
{
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();
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
);
}
}
--------------------------------
转载请注明原文地址: https://yun.8miu.com/read-123302.html