Tiếp theo phần 1, chúng ta hãy cùng cafedev làm demo về Strategy Pattern nhằm giúp ace dễ hiểu khi áp dụng trên các ngôn ngữ khác nhau. Ace có thể tham khảo thêm các bài khác tại series Design Pattern tại đây.

Chúng ta đã thảo luận về một ví dụ về máy bay chiến đấu và giới thiệu Strategy Pattern trong phần 1.

Trong bài này, chúng ta áp dụng Strategy Pattern cho Vấn đề Máy bay chiến đấu và thảo luận về việc triển khai.

Bước đầu tiên là xác định các hành vi có thể khác nhau giữa các lớp khác nhau trong tương lai và tách chúng ra khỏi phần còn lại. Ví dụ của chúng ta, hãy để chúng là những hành vi đá(kick) và nhảy(Jump). Để tách các hành vi này, chúng ta sẽ kéo cả hai phương thức ra khỏi lớp Fighter và tạo một tập hợp các lớp mới để đại diện cho mỗi hành vi.

Lớp Fighter bây giờ sẽ ủy quyền hành vi kick và jump của nó thay vì sử dụng các phương thức kick và jump được khai báo trong lớp Fighter hoặc lớp con của nó.

Sau khi làm lại sơ đồ lớp cuối cùng sẽ là :

So sánh thiết kế của chúng ta với định nghĩa của Strategy Pattern đóng gói các hành vi kick và jump là hai họ thuật toán. Và các thuật toán này có thể hoán đổi cho nhau như thể hiện rõ ràng trong quá trình triển khai.

Dưới đây là cách triển khai trong code Java.

// Java program to demonstrate implementation of 
// Strategy Pattern 

// Abstract as you must have a specific fighter 
abstract class Fighter 
{ 
	KickBehavior kickBehavior; 
	JumpBehavior jumpBehavior; 

	public Fighter(KickBehavior kickBehavior, 
				JumpBehavior jumpBehavior) 
	{ 
		this.jumpBehavior = jumpBehavior; 
		this.kickBehavior = kickBehavior; 
	} 
	public void punch() 
	{ 
		System.out.println("Default Punch"); 
	} 
	public void kick() 
	{ 
		// delegate to kick behavior 
		kickBehavior.kick(); 
	} 
	public void jump() 
	{ 

		// delegate to jump behavior 
		jumpBehavior.jump(); 
	} 
	public void roll() 
	{ 
		System.out.println("Default Roll"); 
	} 
	public void setKickBehavior(KickBehavior kickBehavior) 
	{ 
		this.kickBehavior = kickBehavior; 
	} 
	public void setJumpBehavior(JumpBehavior jumpBehavior) 
	{ 
		this.jumpBehavior = jumpBehavior; 
	} 
	public abstract void display(); 
} 

// Encapsulated kick behaviors 
interface KickBehavior 
{ 
	public void kick(); 
} 
class LightningKick implements KickBehavior 
{ 
	public void kick() 
	{ 
		System.out.println("Lightning Kick"); 
	} 
} 
class TornadoKick implements KickBehavior 
{ 
	public void kick() 
	{ 
		System.out.println("Tornado Kick"); 
	} 
} 

// Encapsulated jump behaviors 
interface JumpBehavior 
{ 
	public void jump(); 
} 
class ShortJump implements JumpBehavior 
{ 
	public void jump() 
	{ 
		System.out.println("Short Jump"); 
	} 
} 
class LongJump implements JumpBehavior 
{ 
	public void jump() 
	{ 
		System.out.println("Long Jump"); 
	} 
} 

// Characters 
class Ryu extends Fighter 
{ 
	public Ryu(KickBehavior kickBehavior, 
			JumpBehavior jumpBehavior) 
	{ 
		super(kickBehavior,jumpBehavior); 
	} 
	public void display() 
	{ 
		System.out.println("Ryu"); 
	} 
} 
class Ken extends Fighter 
{ 
	public Ken(KickBehavior kickBehavior, 
			JumpBehavior jumpBehavior) 
	{ 
		super(kickBehavior,jumpBehavior); 
	} 
	public void display() 
	{ 
		System.out.println("Ken"); 
	} 
} 
class ChunLi extends Fighter 
{ 
	public ChunLi(KickBehavior kickBehavior, 
				JumpBehavior jumpBehavior) 
	{ 
		super(kickBehavior,jumpBehavior); 
	} 
	public void display() 
	{ 
		System.out.println("ChunLi"); 
	} 
} 

// Driver class 
class StreetFighter 
{ 
	public static void main(String args[]) 
	{ 
		// let us make some behaviors first 
		JumpBehavior shortJump = new ShortJump(); 
		JumpBehavior LongJump = new LongJump(); 
		KickBehavior tornadoKick = new TornadoKick(); 

		// Make a fighter with desired behaviors 
		Fighter ken = new Ken(tornadoKick,shortJump); 
		ken.display(); 

		// Test behaviors 
		ken.punch(); 
		ken.kick(); 
		ken.jump(); 

		// Change behavior dynamically (algorithms are 
		// interchangeable) 
		ken.setJumpBehavior(LongJump); 
		ken.jump(); 
	} 
} 

Đầu ra:

Ken
Default Punch
Tornado Kick
Short Jump
Long Jump

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!