定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
结构:就是在把所有情况拆分成多个类,在调用时把这些类分别set进去。
场景:在玩lol时 有攻击,行走,技能使用,那么按照状态模式分,就分为正常时三个行为的状态,被控制是这三个行为的状态,被眩晕时这三个行为的状态。
优点:1.减少if else的使用
2.减少耦合度,是扩展更容易
缺点:使类增多,结构变复杂。
类图:
代码:
Context
1. public classs 我{ 2. 3. private Grade grade; 4. 5. public void setGrade(Grade grade) { 6. this.grade= grade; 7. } 8. //打扮 9. void dressUp( 10. grade.dressUp(); 11. ); 12. 13. //娱乐 14. void entertainment(Grade grade){ 15. grade.dressUp(); 16. } 17. 18. //买车 19. void buyCar( 20. grade.buyCar(); 21. ); 22. 23. 24. }
策略接口
1. public interface Grade( 2. 3. public void dressUp(); 4. 5. public void entertainment(); 6. 7. public void buyCar(); 8. 9. )
策略实现
1. public class has10 implements Grade{ 2. 3. public void dressUp(){ 4. system.out.print("10块钱,来个跨栏背心得了") 5. } 6. 7. public void entertainment(){ 8. system.out.print("10块钱保健啥,洗个澡吧") 9. } 10. 11. public void buyCar(){ 12. system.out.print("10块钱,坐公交吧") 13. } 14. 15. }
1. public class has100 implements Grade{ 2. 3. public void dressUp(){ 4. system.out.print("100块钱,来个山寨耐克") 5. } 6. 7. public void entertainment(){ 8. system.out.print("100块钱,按个脚吧") 9. } 10. 11. public void buyCar(){ 12. system.out.print("100块钱,打车!") 13. } 14. }
1. public class has1000 implements Grade{ 2. 3. public void dressUp(){ 4. system.out.print("1000块钱,来个正品的361度") 5. } 6. 7. public void entertainment(){ 8. system.out.print("1000块钱,来个大保健,正经的") 9. } 10. 11. public void buyCar(){ 12. system.out.print("1000块钱,租车!") 13. } 14. }
调用
1. public static void main(String[] args) { 2. 我 me = new 我(); 3. me.setGrade(new has10()); 4. me.entertainment(); 5. me.dressUp(); 6. me.setGrade(new has100()); 7. me.entertainment(); 8. }