±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÉè¼ÆÄ£Ê½µÄ»ù±¾¸ÅÄî¡¢Éè¼ÆÄ£Ê½×ñѵÄÔÔò¡¢¾µäÉè¼ÆÄ£Ê½¼°Ó¦ÓÃ
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
Ò»¡¢Äܲ¥·Å¸÷ÖÖÉùÒôµÄÈí¼þ²úÆ·(Àí½â¿ª-±ÕÔÔò(Open-Closed Principle,OCP¨C¶ÔÀ©Õ¹¿ª·Å-¶ø¶ÔÐ޸ĹرÕ)¡£Ð´javaÎļþ¡¢±àÒëjavaÎļþ¡¢Ö´ÐÐclassÎļþ¡£
Ààͼ£º

Sound.java£º
public interface
Sound {
public abstract void playSound();
} |
Simulator.java:
public class
Simulator {
Sound sound;
public void setSound(Sound sound) {
this.sound=sound;
}
public void play() {
if(sound!=null) {
sound.playSound();
} else {
System.out.println("ûÓпɲ¥·ÅµÄÉùÒô");
}
}
}
|
Dog.java:
public class
Dog implements Sound {
public void playSound() {
System.out.println("ÍôÍô...ÍôÍô");
}
} |
Violin.java:
public class
Violin implements Sound {
public void playSound() {
System.out.println("СÌáÇÙ.Áº×£");
}
} |
Application.java
public class
Application {
public static void main(String[] args) {
Simulator simulator = new Simulator();
simulator.setSound(new Dog());
simulator.play();
simulator.setSound(new Violin());
simulator.play();
}
}
|
¶þ¡¢¼òµ¥¹¤³§Ä£Ê½¨CÅ®æ´ÔìÈË¡£Ð´javaÎļþ¡¢±àÒëjavaÎļþ¡¢Ö´ÐÐclassÎļþ¡£
Å®æ´¼ÜÆðÁË°ËØÔ¯£¨¼¼ÊõÊõÓ½¨Á¢¹¤³§£©£¬¿ªÊ¼ÔìÈË¡£
¹ý³ÌÈçÏ£ºÏÈÄóÄà°Í³ÉÈËÐΣ¬ÔÙ·ÅÈë°ËØÔ¯À￾£¬×îºóÈÓµ½µØÉϳɳ¤¡£Ê±¼ä¿¾¶ÌÁË£¬Ôì³öÁË¡°°×ÖÖÈË¡±£»Ê±¼ä¿¾³¤ÁË£¬Ôì³öÁË¡°ºÚÖÖÈË¡±£»Ê±¼ä¿¾µÃ²»³¤²»¶Ì£¬Ôì³öÁË¡°»ÆÖÖÈË¡±¡£
Ààͼ£º

Human.java:
public interface
Human {
public void talk();
} |
HumanFactory.java:
public class
HumanFactory {
public static Human createHuman(String s) {
Human human=null;
if(s.equals(new String("whiteHuman")))
human=new WhiteHuman();
if(s.equals(new String("yellowHuman")))
human=new YellowHuman();
return human;
}
} |
YellowHuman.java:
public class
YellowHuman implements Human {
public void talk() {
System.out.println("ÄúºÃ£¡");
} } |
BlackHuman.java:
public class
BlackHuman implements Human {
public void talk() {
System.out.println("ºÚºð£¡");
} } |
WhiteHuman.java:
public class
WhiteHuman implements Human {
public void talk() {
System.out.println("Hello!");
} } |
NvWa.java:
public class
NvWa {
public static void main(String [] args) {
Human human=HumanFactory.createHuman("yellowHuman");
human.talk();
}
}
|
Èý¡¢¹¤³§·½·¨Ä£Ê½¨CÅ®æ´ÔìÈË¡£Ð´javaÎļþ¡¢±àÒëjavaÎļþ¡¢Ö´ÐÐclassÎļþ¡£
Ààͼ£º

Human.java:
public interface
Human {
public void talk();
} |
HumanFactory.java:
public interface
HumanFactory {
public Human createHuman();
} |
YellowHuman.java:
public class
YellowHuman implements Human {
public void talk() {
System.out.println("ÄúºÃ£¡");
} } |
WhiteHuman.java:
public class
WhiteHuman implements Human {
public void talk() {
System.out.println("Hello!");
} }
|
BlackHuman.java:
public class
BlackHuman implements Human {
public void talk() {
System.out.println("ºÙºÙ");
}
}
|
YellowHumanF.java:
public class
YellowHumanF implements HumanFactory {
public Human createHuman() {
return new YellowHuman();
} }
|
BlackHumanF.java:
public class
BlackHumanF implements HumanFactory {
public Human createHuman() {
return new BlackHuman();
} }
|
WhiteHumanF.java:
public class
WhiteHumanF implements HumanFactory {
public Human createHuman() {
return new WhiteHuman();
} }
|
NvWa.java:
public class
NvWa {
public static void main(String[] args) {
HumanFactory humanFactory=null;
humanFactory=new WhiteHumanF();
Human human=humanFactory.createHuman();
human.talk();
}
} |
ËÄ¡¢ÊÊÅäÆ÷ģʽ¨C½»Á÷µçתֱÁ÷µç¡£Ð´javaÎļþ¡¢±àÒëjavaÎļþ¡¢Ö´ÐÐclassÎļþ¡£
Óû§¼ÒÀïÏÖÓÐһ̨ϴÒ»ú£¬Ï´Ò»úʹÓý»Á÷µç£¬ÏÖÔÚÓû§ÐÂÂòÁËһ̨¼Òô»ú£¬Â¼Òô»úÖ»ÄÜʹÓÃÖ±Á÷µç¡£ÓÉÓÚ¹©µçϵͳ¹©¸øÓû§¼ÒÀïµÄÊǽ»Á÷µç£¬Òò´ËÓû§ÐèÒªÓÃÊÊÅäÆ÷½«½»Á÷µçת»¯Ö±Á÷µç¹©Â¼Òô»úʹÓá£
Ààͼ£º

DirectCurrent.java:
public interface
DirectCurrent {
public String giveDirectCurrent();
} |
AlternateCurrent.java:
public interface
AlternateCurrent {
public String giveAlternateCurrent();
} |
ElectricAdapter.java:
public class
ElectricAdapter implements DirectCurrent {
AlternateCurrent out;
ElectricAdapter(AlternateCurrent out) {
this.out=out;
}
public String giveDirectCurrent() {
String m=out.giveAlternateCurrent(); //ÏÈÓÉoutµÃµ½½»Á÷µç
StringBuffer str=new StringBuffer(m);
for (int i=0; i<str.length(); i++) //½«½»Á÷µçתΪֱÁ÷µç
if(str.charAt(i)=='0') str.setCharAt(i,'1');
m=new String(str);
return m; //·µ»ØÖ±Á÷µç
}
} |
PowerCompany.java:
public class
PowerCompany implements AlternateCurrent {
public String giveAlternateCurrent() {
return "10101010101010101010";
}
} |
Application.java
public class
Application {
public static void main(String[] args) {
AlternateCurrent aElectric = new PowerCompany();
//½»Á÷µçaElectric
Wash wash=new Wash();
wash.turnOn(aElectric); //Ï´Ò»úʹÓý»Á÷µçaElectric
DirectCurrent dElectric=new ElectricAdapter(aElectric);
//½«½»Á÷µçÊÊÅä³ÉÖ±Á÷µç
Recorder recorder=new Recorder();
recorder.turnOn(dElectric); //¼Òô»úʹÓÃÖ±Á÷µçdElectric
}
}
class Wash {
String name;
Wash() { name = "Ï´Ò»ú"; }
public void turnOn(AlternateCurrent a) {
String s = a.giveAlternateCurrent();
System.out.println(name+"ʹÓý»Á÷µç£º\n"+s);
System.out.println("¿ªÊ¼Ï´ÒÂÎï¡£");
}
}
class Recorder { //¼Òô»úʹÓÃÖ±Á÷µç
String name;
Recorder() { name = "¼Òô»ú"; }
public void turnOn(DirectCurrent a) {
String s=a.giveDirectCurrent();
System.out.println(name+"ʹÓÃÖ±Á÷µç£º\n"+s);
System.out.println("¿ªÊ¼Â¼Òô¡£");
}
}
|
Îå¡¢²ßÂÔģʽ¨CÆÀ·Ö·½°¸¡£Ð´javaÎļþ¡¢±àÒëjavaÎļþ¡¢Ö´ÐÐclassÎļþ¡£
ÔÚ¶à¸ö²ÃÅиºÔð´ò·ÖµÄ±ÈÈüÖÐ,ÿλ²ÃÅиøÑ¡ÊÖÒ»¸öµÃ·Ö,Ñ¡ÊÖµÄ×îºóµÃ·ÖÊǸù¾ÝÈ«Ìå²ÃÅеĵ÷ּÆËã³öÀ´µÄ¡£Çë¸ø³ö¼¸ÖÖ¼ÆËãÑ¡ÊÖµÃ·ÖµÄÆÀ·Ö·½°¸£¨²ßÂÔ£©,¶ÔÓÚij´Î±ÈÈü,¿ÉÒÔ´ÓÄãµÄ·½°¸ÖÐÑ¡ÔñÒ»ÖÖ·½°¸×÷Ϊ±¾´Î±ÈÈüµÄÆÀ·Ö·½°¸¡£
Ààͼ£º

Strategy.java:
public interface
Strategy {
public double computerAverage(double []a);
} |
AverageScore.java:
public class
AverageScore {
Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy=strategy;
}
public double getAverage(double []a) {
return strategy.computerAverage(a);
}
}
|
StrategyA.java:
public class
StrategyA implements Strategy {
public double computerAverage(double []a) {
double score=0,sum=0;
for(int i=0;i<a.length;i++) {
sum=sum+a[i];
}
score=sum/a.length;
return score;
}
}
|
StrategyB.java:
public class
StrategyB implements Strategy {
public double computerAverage(double []a) {
if(a.length<=2)
return 0;
double score=0,sum=0;
Arrays.sort(a); //ÅÅÐòÊý×é
for (int i=1; i<a.length-1; i++) {
sum=sum+a[i];
}
score=sum/(a.length-2);
return score;
}
}
|
Application:
public class
Application {
public static void main(String[] args) {
AverageScore game=new AverageScore();
game.setStrategy(new StrategyA());
double []a={9.12,9.25,8.87,9.99,6.99,7.88};
double aver=game.getAverage(a);
System.out.println(aver);
}
} |
Î塢״̬ģʽ¨C×Ô¶¯ÊÛ»õ»ú¡£Ð´javaÎļþ¡¢±àÒëjavaÎļþ¡¢Ö´ÐÐclassÎļþ¡£
¿§·È×Ô¶¯ÊÛ»õ»ú¹²ÓÐ3ÖÖ״̬£¬·Ö±ðÊÇ¡°Óп§·È£¬ÎÞÈËͶ±Ò¡±¡¢¡°Óп§·È£¬ÓÐÈËͶ±Ò¡±ºÍ¡°ÎÞ¿§·È¡±¡£¿§·È×Ô¶¯ÊÛ»õ»úÓÐÁ½¸ö·½·¨£ºneedAnCoin(
)ºÍsellCoffee( )¡£
¿§·È×Ô¶¯ÊÛ»õ»úµÄĬÈϳõʼ״̬ÊÇ¡°Óп§·È£¬ÎÞÈËͶ±Ò¡±¡£µ±¿§·È×Ô¶¯ÊÛ»õ»ú´¦ÓÚ¡°Óп§·È£¬ÎÞÈËͶ±Ò¡±×´Ì¬Ê±£¬µ÷ÓÃsellCoffee(
)·½·¨½«ÏÔʾ¡°ÐèͶһԪӲ±Ò£¬²Å¿ÉÒԵõ½Ò»±¿§·È¡±£¬²¢±£³Öµ±Ç°µÄ״̬£»µ÷ÓÃneedAnCoin( )·½·¨½«ÏÔʾ¡°¿§·È»úÀﱻͶÈëÁËÒ»ÔªÓ²±Ò¡±£¬È»ºó¿§·È×Ô¶¯ÊÛ»õ»ú½«´¦ÓÚ¡°Óп§·È£¬ÓÐÈËͶ±Ò¡±×´Ì¬£¬´Ëʱ£¬Èç¹ûµ÷ÓÃsellCoffee(
)·½·¨½«ÏÔʾ¡°ËͳöÒ»±¿§·È¡±£¬È»ºó¿§·È×Ô¶¯ÊÛ»õ»ú½«´¦ÓÚ¡°Óп§·È£¬ÎÞÈËͶ±Ò¡±×´Ì¬»ò¡°ÎÞ¿§·È¡±×´Ì¬£»µ±¿§·È°×¶¯ÊÛ»õ»ú´¦ÓÚ¡°ÎÞ¿§·È¡±×´Ì¬Ê±£¬µ÷ÓÃgiveAnCupCoffee(
)·½·¨½«ÏÔʾ¡°Ã»Óп§·ÈÁË£¬Ç벦111111·þÎñµç»°¡±£¬µ÷ÓÃneedAnCoin( )·½·¨½«ÏÔʾ¡°Í¶±ÒÎÞЧ£¬Í˻أ¡¡±
ÇëʹÓÃ״̬ģʽģÄâ¿§·È×Ô¶¯ÊÛ»õ»ú¡£
Ààͼ

State.java:
public abstract
class State{
int coffeeCount; //¼Ç¼һ¹²ÓжàÉÙ±¿§·È
public abstract void giveAnCupCoffee();
public abstract void comeInCoin();
}
|
AutoCoffeeMachine.java:
public class
AutoCoffeeMachine {
State haveCoffeeNoCoin,haveCoffeeAndCoin,haveNotCoffee;
State state;
AutoCoffeeMachine( ){
haveCoffeeNoCoin=new HaveCoffeeNoCoin(this);
haveCoffeeAndCoin=new HaveCoffeeAndCoin(this);
haveNotCoffee=new HaveNotCoffee(this);
haveCoffeeNoCoin.coffeeCount=3;
state=haveCoffeeNoCoin; //ÉèÖÃÊÛ»õ»ú³õʼ״̬
}
public void sellCoffee( ){ state.giveAnCupCoffee(
); }
public void needAnCoin( ){ state.comeInCoin( );
}
public void setState(State state){ this.state=state;
}
} |
HaveCoffeeAndCoin.java:
public class
HaveCoffeeAndCoin extends State{
AutoCoffeeMachine machine;
HaveCoffeeAndCoin(AutoCoffeeMachine machine){
this.machine=machine; }
public void giveAnCupCoffee( ){
int n=machine.haveCoffeeNoCoin.coffeeCount;
if(n>1) { n--;
System.out.println("ËͳöÒ»±¿§·È");
machine.haveCoffeeNoCoin.coffeeCount = n;
machine.setState(machine.haveCoffeeNoCoin);
} else if(n==1) { n--;
System.out.println("ËͳöÒ»±¿§·È");
machine.setState(machine.haveNotCoffee); }
}
public void comeInCoin( ){
System.out.println("Ŀǰ²»ÔÊÐíͶ±Ò");
}
}
|
HaveCoffeeNoCoin.java
public class
HaveCoffeeNoCoin extends State{
AutoCoffeeMachine machine;
HaveCoffeeNoCoin(AutoCoffeeMachine machine){
this.machine=machine;
}
public void giveAnCupCoffee(){
System.out.println("ÐèͶÈëÒ»Ôª,²Å¿ÉµÃÒ»±");
}
public void comeInCoin(){
System.out.println("ͶÈëÁËÒ»ÔªÓ²±Ò");
machine.setState(machine.haveCoffeeAndCoin);
}
}
|
HaveNotCoffee.java:
public class
HaveNotCoffee extends State{
AutoCoffeeMachine machine;
HaveNotCoffee(AutoCoffeeMachine machine){
this.machine=machine;
}
public void giveAnCupCoffee( ){
System.out.println("û¿§·ÈÁË,Ç벦111111");
}
public void comeInCoin( ){
System.out.println("Ͷ±ÒÎÞЧ£¬Í˻أ¡");
}
}
|
Application.java:
public class
Application{
public static void main(String args[ ]){
AutoCoffeeMachine machine = new AutoCoffeeMachine(
);
machine.sellCoffee( ); machine.needAnCoin( );
machine.sellCoffee( ); machine.needAnCoin( );
machine.sellCoffee( ); machine.needAnCoin( );
machine.sellCoffee( ); machine.needAnCoin( );
machine.sellCoffee( );
}
}
|
Ìå»á£º²ßÂÔģʽÓë״̬ģʽ¼«ÆäÏàËÆ£¬µ«ÊǶþÕßÓÐÆäÄÚÔڵIJî±ð£¬²ßÂÔģʽ½«¾ßÌå²ßÂÔÀ౩¶³öÈ¥£¬µ÷ÓÃÕßÐèÒª¾ßÌåÃ÷°×ÿ¸ö²ßÂԵIJ»Í¬Ö®´¦ÒÔ±ãÕýȷʹÓ᣶ø×´Ì¬Ä£Ê½×´Ì¬µÄ¸Ä±äÊÇÓÉÆäÄÚ²¿Ìõ¼þÀ´¸Ä±äµÄ£¬ÓëÍâ½çÎ޹أ¬¶þÕßÔÚ˼ÏëÉÏÓб¾ÖÊÇø±ð¡£
Æß¡¢Ä³ÓÎÏ·¹«Ë¾ÏÖÓû¿ª·¢Ò»¿îÃæÏò¶ùͯµÄÄ£ÄâÓÎÏ·£¬¸ÃÓÎÏ·Ö÷ҪģÄâÏÖʵÊÀ½çÖи÷ÖÖѼ×ӵķ¢ÉùÌØÕ÷¡¢·ÉÐÐÌØÕ÷ºÍÍâ¹ÛÌØÕ÷¡£ÓÎÏ·ÐèҪģÄâµÄѼ×ÓÖÖÀ༰ÆäÌØÕ÷ÈçϱíËùʾ¡£

ΪÁËÖ§³Ö½«À´Äܹ»Ä£Äâ¸ü¶àÖÖÀàѼ×ÓµÄÌØÕ÷£¬¾ö¶¨²ÉÓòßÂÔ(Strategy)ģʽ¡£ÊÔ»³ö¶ÔÓ¦µÄÉè¼ÆÄ£Ê½µÄÀàͼ½á¹¹Í¼¡£²¢Ð´javaÎļþ¡¢±àÒëjavaÎļþ¡¢Ö´ÐÐclassÎļþ¡£
Ààͼ£º

FlyBehavior.java:
public interface
FlyBehavior {
public void fly();
}
|
QuackBehavior.java:
public interface
QuackBehavior {
public void quack();
}
|
Duck.java:
public abstract
class Duck {
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
public void setFlyBehavior(FlyBehavior flyBehavior)
{
this.flyBehavior = flyBehavior;
} public void setQuackBehavior(QuackBehavior
quackBehavior) {
this.quackBehavior = quackBehavior;
} public void setAppearance(String appearance)
{
this.appearance = appearance;
} private String appearance;
public void fly() { flyBehavior.fly(); }
public void quack() { quackBehavior.quack();
}
public void display(){
System.out.println(appearance);
}
}
|
FlyWithWings.java:
public class
FlyWithWings implements FlyBehavior { public void fly() {
System.out.println("ʹÓóá°ò·ÉÐÐ");
} }
|
FlyNoWay.java:
public class
FlyNoWay implements FlyBehavior { public void fly() {
System.out.println("²»ÄÜ·ÉÐÐ");
} }
|
Quack.java:
public class
Quack implements QuackBehavior { public void quack() {
System.out.println("·¢³ö¡°¸Â¸Â¡±Éù");
} }
|
QuackNoWay.java:
public class
QuackNoWay implements QuackBehavior { public void quack() {
System.out.println("²»ÄÜ·¢Éù");
} }
|
Squeak.java:
public class
Squeak implements QuackBehavior { public void quack() {
System.out.println("·¢³öÏðƤÓë¿ÕÆøÄ¦²ÁÉù");
} }
|
CottonDuck.java:
public class
CottonDuck extends Duck{
CottonDuck() {
super();
super.setAppearance("°×É«");
super.setQuackBehavior(new QuackNoWay());
super.setFlyBehavior(new FlyNoWay());
}
}
|
MallardDuck.java:
public class
MallardDuck extends Duck { MallardDuck(){
super();
super.setAppearance("»Ò°×Óðë");
super.setQuackBehavior(new Quack());
super.setFlyBehavior(new FlyWithWings());
}
}
|
RedHeadDuck.java:
public class
RedHeadDuck extends Duck{
RedHeadDuck() {
super();
super.setAppearance("»ÒÉ«ÖÆÃ«ºìÍ·");
super.setQuackBehavior(new Quack());
super.setFlyBehavior(new FlyWithWings());
}
}
|
RubherDuck.java:
public class
RubherDuck extends Duck{
RubherDuck() {
super();
super.setAppearance("ºÚÏðÆ¤°×É«");
super.setQuackBehavior(new Squeak());
super.setFlyBehavior(new FlyNoWay());
}
}
|
|