[ad_1]
Yazılım geliştiricileri olarak en büyük zorluklarımızdan biri, kodumuzu genişletmesi ve bakımı daha kolay olacak şekilde düzenlemektir. Komut kalıbı, bir eylemi gerçekleştirmek için gereken tüm verileri tek bir Command
nesne.
Günlük hayatımızda her zaman kullandığımız için Komut modelini tanıyabilirsiniz. İyi bir örnek, televizyonu açmak, kanalları değiştirmek, sesi açmak vb. için bir uzaktan kumanda cihazı kullanmaktır. Bu eylemlerin her biri uzaktan kumanda cihazında kapsüllenmiştir.
Tüm bu eylemler hakkında dikkat edilmesi gereken başka bir şey, onların tersine çevrilebilir: TV’yi açabilir ve ayrıca kapatabilirsiniz. Ek olarak, bazı işlemler sırayla yapılmalıdır: Sesi açmadan önce TV’yi açmalısınız.
Bu Java kodu yarışmasında, Komut tasarım deseni hakkında bilgi edinecek ve pratikte desenin birkaç örneğini göreceksiniz. Ayrıca Komut kalıbının iki temel ilkeyi nasıl uyguladığını da tartışacağım. SAĞLAM modeli. İki ilke, tek sorumluluk ilkesibir sınıfın yalnızca bir işi olması gerektiğini belirtir ve açık-kapalı prensibiBu, nesnelerin veya varlıkların genişletmeye açık, ancak değişiklik için kapalı olması gerektiğini belirtir.
Komut kalıbı nedir?
Komut deseni, Komut deseni ile tanıtılan 23 tasarım deseninden biridir. Dörtlü tasarım desenleri çetesi. Komut bir davranışsal tasarım deseni, belirli bir kod deseninde bir eylemi gerçekleştirmeyi amaçladığı anlamına gelir.
İlk tanıtıldığında, Komut kalıbı bazen Java için geri aramalar olarak açıklandı. Java 8, nesne yönelimli bir tasarım deseni olarak yola çıkmış olsa da, lambda ifadeleri sunarak, nesne-fonksiyonel uygulama Komut deseni. Bu makale, Komut deseninde bir lambda ifadesi kullanan bir örnek içerir.
Tüm tasarım desenlerinde olduğu gibi, Komut deseninin ne zaman uygulanacağını ve başka bir desenin ne zaman daha iyi olabileceğini bilmek çok önemlidir. Bir kullanım durumu için yanlış tasarım deseni kullanmak, kodunuzu daha az değil, daha karmaşık hale getirebilir.
JDK’daki Komut kalıbı
Java Geliştirme Kitinde ve Java ekosisteminde Komut modelinin birçok örneğini bulabiliriz. Popüler bir örnek, Runnable
ile fonksiyonel arayüz Thread
sınıf. Bir diğeri, olayları bir ActionListener
. Bu örneklerin her ikisini de inceleyelim.
Thread ve Runnable ile Komut deseni
Runnable
içeren bir arayüzdür. run()
yöntem. Aşağıdaki kod parçası, run()
yöntemin imzası. Gördüğünüz gibi, bir komut iletmek mümkündür. run()
yöntem:
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Thread
alan en çok kullanılan sınıftır. Runnable
. Bir komutu nasıl iletebileceğimizi görelim. Thread
sınıf:
Runnable command = () -> System.out.println("Executing command!");
Thread thread = new Thread(command); // Setting command
thread.start();
Bu kodda, komut davranışını şurada uyguluyoruz: run()
lambda ifadeli yöntem. Lambda yerine bir anonim iç sınıfuygulayan adsız bir sınıf olan Runnable
ve run()
yöntem. Ancak bu yaklaşım kodu daha ayrıntılı hale getirecektir. Lambda’yı kullanmak daha özlü ve okunması daha kolaydır.
Daha sonra komuta geçiyoruz. Thread
sınıf. Son olarak, komutu çağırarak komutu çalıştırıyoruz. start()
yöntem.
İşte bu koddan bekleyebileceğimiz çıktı:
Executing command!
ActionListener ile Komut deseni
JDK’daki bir başka iyi örnek de şudur: ActionListener
arayüz. Daha eski bir arayüz olduğunu biliyorum, ancak örnek olarak uygun.
Aşağıdaki kodda bir JFrame
ve bir JButton
. Daha sonra butondaki eylemi çağırarak ayarlıyoruz. addActionListener()
yöntem. Bu durumda, “Beni tıkla” metnini “Tıklandı” olarak değiştireceğiz. Ardından, çerçeveye düğmeyi ekleyeceğiz ve çerçeveyi düğmeyle göstereceğiz:
JFrame frame = new JFrame();
JButton button = new JButton("Click Me");
button.addActionListener(e -> button.setText("Clicked!")); // Command implementation
frame.add(button);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Şekil 1, butona tıklandıktan sonra bu kodun sonuçlarını göstermektedir.
Şekil 1. ActionListener iş başında.
Motosikletimi sür! Araç arayüzündeki Komut deseni
Artık JDK’daki Komut şablonunun örneklerini gördüğünüze göre, şimdi kendi modelimizi oluşturalım. İlk olarak, Şekil 2’deki sınıf diyagramına bir göz atın.
Şekil 2. Bir Araç arayüzü için Komut düzeninin bir diyagramı.
Diyagramın açıklayacağım üç bölümü var.
Emretmek
Komut kalıbı için temel sınıf, Command
arayüz. Bir komutu yürütmek veya geri almak istediğimizde bu arayüzü kullanırız:
public interface Command {
void execute();
void revert();
}
Alıcı
Ardından, komutu yürütme davranışına sahip sınıfı oluşturmamız gerekiyor. ile başlıyoruz Vehicle
arayüzü oluşturun, ardından Motorcycle
ve Truck
uygulamak için sınıflar:
public interface Vehicle {
void start();
void stop();
void accelerate();
}
public class Motorcycle implements Vehicle {
@Override
public void start() {
System.out.println("Starting motorcycle...");
}
@Override
public void stop() {
System.out.println("Stopping motorcycle...");
}
@Override
public void accelerate() {
System.out.println("Accelerating motorcycle...");
}
}
public class Truck implements Vehicle {
@Override
public void start() {
System.out.println("Starting truck...");
}
@Override
public void stop() {
System.out.println("Stopping truck...");
}
@Override
public void accelerate() {
System.out.println("Accelerating truck...");
}
@Override
public void decelerate() {
System.out.println("Decelerating truck...");
}
}
Ayrıca dikkat edin Vehicle
arayüz, kodu daha esnek ve değiştirmeyi kolaylaştırır: aşağıdaki gibi başka bir aracı kolayca ekleyebiliriz Car
uygulayan Vehicle
arayüz. Komut modelinin bu kısmı, açık-kapalı SOLID ilkesinin harika bir örneğidir. (Bu ilkenin nesnelerin veya varlıkların genişletilebilir olması gerektiğini belirttiğini unutmayın.)
çağıran
Şimdi, elimizde Motorcycle
ve Truck
davranış ama onu yürütmek için bir sınıfa ihtiyacımız var. Bizim durumumuzda, bu sınıf olacak GhostRider
. GhostRider
sürecek Motorcycle
ve Truck
sınıflar.
GhostRider
yapıcıdaki komutu alır ve execute()
komuttan yönteme takeAction()
ve revertAction()
yöntemler:
public class GhostRider {
Command command;
public GhostRider(Command command){
this.command = command;
}
public void setCommand(Command command) {
this.command = command;
}
public void takeAction(){
command.execute();
}
public void revertAction() {
command.revert();
}
}
Komut deseninde komutları uygulama
Şimdi, oluşturalım StartMotorcycle
, AccelerateMotorcycle
ve StartAllVehicles
komutlar. Her komut şunları uygular: Command
arayüz ve alır Vehicle
yapıcıda. Ardından, her bir komut sınıfına karşılık gelen yöntemi çağırır. Vehicle
içine execute()
yöntem:
public class StartMotorcycle implements Command {
Vehicle vehicle;
public StartMotorcycle(Vehicle vehicle) {
this.vehicle = vehicle;
}
public void execute() {
vehicle.start();
}
@Override
public void revert() {
vehicle.stop();
}
}
public class AccelerateMotorcycle implements Command {
Vehicle vehicle;
public AccelerateMotorcycle(Vehicle vehicle){
this.vehicle = vehicle;
}
public void execute() {
vehicle.accelerate();
}
@Override
public void revert() {
vehicle.decelerate();
}
}
import java.util.List;
public class StartAllVehicles implements Command {
List<Vehicle> vehicles;
public StartAllVehicles(List<Vehicle> vehicles) {
this.vehicles = vehicles;
}
public void execute() {
vehicles.forEach(vehicle -> vehicle.start());
}
@Override
public void revert() {
vehicles.forEach(vehicle -> vehicle.stop());
}
}
komutları çalıştırın
Komutlarımızı çalıştırma zamanı! Bunun için ilk önce Motorcycle
sahip olan sınıf Command
davranış, sonra her birine iletin Command
uygulama.
Şunu da kullandığımıza dikkat edin: StartAllVehicles
aynı anda birden fazla aracı çalıştırma (ve durdurma) komutu.
Ardından, somutlaştırıyoruz GhostRider
her komutu yürütecek sınıf. Son olarak, şunu çağırıyoruz: takeAction()
ve revertAction()
yöntemler:
public class RideVehicle {
public static void main(String[] args) {
Vehicle motorcycle = new Motorcycle();
StartMotorcycle startCommand = new StartMotorcycle(motorcycle);
GhostRider ghostRider = new GhostRider(startCommand);
ghostRider.takeAction();
AccelerateMotorcycle accelerateCommand = new AccelerateMotorcycle(motorcycle);
ghostRider.setCommand(accelerateCommand);
ghostRider.takeAction();
ghostRider.revertAction();
Vehicle truck = new Truck();
List<Vehicle> vehicles = List.of(motorcycle, truck);
StartAllVehicles startAllVehicles = new StartAllVehicles(vehicles);
startAllVehicles.execute();
startAllVehicles.revert();
}
}
İşte bu kodun çıktısı:
Starting motorcycle...
Accelerating motorcycle...
Decelerating motorcycle...
Starting motorcycle...
Starting truck...
Stopping motorcycle...
Stopping truck…
Komut deseni ne zaman kullanılır?
Tasarım desenleri için çok önemli bir kural, onları ne zaman kullanacağını bilmektir. Bir model ne kadar harika olursa olsun, onu yanlış kullanım durumu için uygulamak kodunuzu çok daha kötü hale getirecektir. Komut desenini kullanmak için bazı yönergeler şunlardır:
- Tek sorumluluk ve açık-kapalı tasarımın SOLID ilkelerine dayalı olarak ayrı ayrı uygulanması gereken birden çok komutunuz var.
- Alışveriş sepetine ürün ekleme ve çıkarma gibi tersine çevrilebilir komutlar oluşturmanız gerekir.
- Bir komut yürütüldüğünde günlükler oluşturabilmeniz gerekir. Komut desenindeki her komut kapsüllenmiştir, bu nedenle günlük oluşturmak kolaydır.
- Aynı anda birden fazla komut çalıştırabilmeniz gerekir. kolayca ekleyebilirsiniz
Queue
,List
veyaSet
bir komutun uygulanmasına dönüştürün ve bunları yürütün.
Komut kalıbı hakkında hatırlanması gerekenler
Özetlemek gerekirse, Komut kalıbı hakkında aşağıdakileri unutmayın:
- Tek sorumluluk ve açık-kapalı tasarımın SOLID ilkelerini uygular.
- Kodunuzu daha genişletilebilir hale getiren komutların davranışını kapsüller ve ayrıştırır.
- JDK’da şu şekilde kullanılır:
Thread
sınıf veRunnable
veActionListener
arayüzler. - Komutların davranışını tek bir
Command
uygulama. - Tek komutları yürütmenize ve geri almanıza izin verir.
- Birden çok komutu birlikte yürütmenize ve geri almanıza olanak tanır.
Telif Hakkı © 2022 IDG Communications, Inc.
[ad_2]
Kaynak : https://www.infoworld.com/article/3667498/how-to-use-the-command-pattern-in-java.html#tk.rss_all