English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dieser Artikel beschreibt ein Beispiel für das Android-Programmierungsdesignmuster Strategiemuster. Hiermit wird allen zur Verfügung gestellt und wie folgt dargestellt:
1. Einführung
In der Softwareentwicklung wird es oft solche Fälle geben: Die Implementierung einer bestimmten Funktion kann mehrere Algorithmen oder Strategien haben, und wir wählen je nach实际情况 verschiedene Algorithmen oder Strategien aus, um diese Funktion durchzuführen. Zum Beispiel, Sortieralgorithmen, die Insertionsortierung, Mergesort, Bubblesort und andere verwenden können.
Für diese Situation ist eine gängige Methode, mehrere Algorithmen in einer Klasse zu schreiben. Zum Beispiel, wenn mehrere Sortieralgorithmen bereitgestellt werden müssen, können diese Algorithmen in einer Klasse geschrieben werden, wobei jede Methode einem spezifischen Sortieralgorithmus entspricht: Natürlich können diese Sortieralgorithmen auch in einer einheitlichen Methode verpackt werden, um den spezifischen Algorithmus durch if...else... oder case-etc.-Bedingungsbedingungen auszuwählen. Beide Implementierungsmethoden können als Hardcoding bezeichnet werden. Wenn viele Algorithmen in einer Klasse konzentriert sind, wird diese Klasse voluminös und die Wartungskosten dieser Klasse steigen. Es ist auch einfacher, Fehler beim Warten zu verursachen. Wenn wir einen neuen Sortieralgorithmus hinzufügen müssen, müssen wir die Quelldatei der Algorithmusverpackungsklasse ändern. Dies verstößt eindeutig gegen das OCP-Prinzip und das Prinzip der Einzigen Verantwortung.
Wenn diese Algorithmen oder Strategien abstrahiert und eine einheitliche Schnittstelle bereitgestellt werden, haben verschiedene Algorithmen oder Strategien unterschiedliche Implementierungsklassen. Auf diese Weise kann der Programmclient verschiedene Implementierungsinstanzen injizieren, um die dynamische Ersetzung von Algorithmen oder Strategien durchzuführen. Diese Art der Erweiterbarkeit und Wartbarkeit ist auch höher, was auch das in diesem Abschnitt behandelte Strategiemuster ist.
Kurz gesagt, wenn ein Problem mehrere Lösungen hat, ist der einfachste Weg, wenn es mehrere Lösungen gibt, ist es am besten, es durch if zu nutzen.-oder else oder switch-Die Methode case wählt basierend auf verschiedenen Situationen verschiedene Lösungen, aber dies führt zu einer zu hohen Kopplung, voluminösem Code und schwer zu warten. In diesem Fall kann das Muster der Strategie verwendet werden, um dies zu lösen.
Zwei: Definition
Der Muster der Strategie definiert eine Reihe von Algorithmen und packt jeden Algorithmus ein und macht es auch möglich, sie miteinander zu ersetzen. Der Muster der Strategie lässt die Algorithmen unabhängig von den Kunden, die sie verwenden, unabhängig zu ändern.
Drei: Anwendungsszenario
wenn es mehrere Behandlungsweisen für dasselbe Problem gibt und nur die spezifische Verhaltensweise unterschiedlich ist
wenn es erforderlich ist, sicher zu verpacken, um mehrere gleiche Arten von Operationen zu sichern
wenn es mehrere Unterklassen desselben abstrakten Klassen gibt und es ist erforderlich, if zu verwenden-oder else oder switch-bei der Auswahl spezifischer Unterklassen durch case
Vier: UML-Klassendiagramm des Musters der Strategie
UML-Klassendiagramm:
Context: Wird verwendet, um die Strategie zu operieren, um die Umgebungsbedingungen.
Stragety: Strategische Abstraktion.
ConcreteStrategyA, ConcreteStrategyB: Konkrete Strategieimplementierung.
Vier: Einfache Implementierung
Anforderung: Berechnung des Buchpreises, Anfängermitglied hat keinen Rabatt, mittleres Mitglied reduziert9Rabatt, das Vereinbarungsmitglied wird8Rabatt. Wenn die allgemeine Schreibweise, sollte es sein-Ansonsten wird geprüft, welche Mitgliedsstufe es ist, und der entsprechende Rabatt wird berechnet. Unten wird das Muster der Strategie verwendet, um dies zu realisieren.
Abstrakte Rabattklasse:
public interface MemberStrategy { /** * Berechnung des Buchpreises * @param booksPrice Der ursprüngliche Preis des Buches * @return Berechnet den reduzierten Preis */ public double calcPrice(double booksPrice); }
Anfängermitgliedsrabattklasse:
public class PrimaryMemberStrategy implements MemberStrategy{ /** * Anfängermitgliedsrabatt */ @Override public double calcPrice(double booksPrice) { System.out.println("Für das mittlere Mitglied gibt es keinen Rabatt"); return booksPrice; } }
Mittleres Mitgliedsrabattklasse:
public class IntermediateMemberStrategy implements MemberStrategy{ /** * Mittleres Mitgliedsrabatt */ @Override public double calcPrice(double booksPrice) { System.out.println("Für das Rabatt für das mittlere Mitglied ist:",10%); return booksPrice * 0.9; } }
Vereinbarungsmitgliedsrabattklasse:
public class AdvancedMemberStrategy implements MemberStrategy{ /** * Vereinbarungsmitgliedsrabatt */ @Override public double calcPrice(double booksPrice) { System.out.println("Der Rabatt für Premium-Mitglieder beträgt"}20%) return booksPrice * 0.8; } }
Preisklasse:
public class Price { //Behält ein spezifisches Strategie-Objekt bei private MemberStrategy strategy; /** * Konstruktor, übergibt ein spezifisches Strategie-Objekt * @param strategy Der spezifische Strategie-Objekt */ public Price(MemberStrategy strategy){ this.strategy = strategy; } /** * Berechnung des Buchpreises * @param booksPrice Der ursprüngliche Preis des Buches * @return Berechnet den reduzierten Preis */ public double quote(double booksPrice){ return this.strategy.calcPrice(booksPrice); } }
Klient:
public class Client { public static void main(String[] args) { //Auswahl und Erstellung des zu verwendenden Strategie-Objekts MemberStrategy strategy1 = new AdvancedMemberStrategy(); //Erstellung der Umgebung Price price = new Price(strategy1); //Berechnung des Preises double quote = price.quote(300); System.out.println("Der endgültige Preis des Buches beträgt:") + quote); } }
Ergebnis:
Der Rabatt für Premium-Mitglieder beträgt20% Der endgültige Preis des Buches beträgt:240.0
Sechs, Unterschied zwischen Strategie-Muster und Fabrik-Muster
Fabrik-Muster | Strategie-Muster |
---|---|
Erstellungsbasierte Designmuster | Verhaltensbasierte Designmuster |
Bezugnahme auf die Objekterstellung | Beeinflussung der Verhaltensauswahl |
Schwarzes Kästchen (braucht keine spezifische Implementierungskenntnisse) | Weißes Kästchen (kennt den spezifischen Implementierungsprozess) |
Sieben, die Implementierung des Strategie-Musters in den Android-Quellcodes
Mit der Entwicklung der Technologie haben Ingenieure immer mehr Wert auf das Benutzererlebnis und die Benutzerinteraktion gelegt. Daher ist die Animation zu einem unverzichtbaren Teil vieler Anwendungen geworden, auch eine einfache Anleitungseite muss einen animierten Effekt haben, und die Verdeckung eines Buttons erfordert auch die Einführung von Ein- und Ausblenden-Effekten. Der Implementierungsmechanismus der Animation besteht darin, in kurzer Zeit schnelle Bildwechsels durchzuführen, und die Wechselfrequenz muss so hoch sein, dass das menschliche Auge keine Ruckler wahrnimmt, zum Beispiel ist der Standardfilm24Bildpunkte/Sekunde. Bei einer flüssigen Wiedergabe können Animationen auf Android eine Geschwindigkeit erreichen60帧/秒,人眼基本看不出间隔,所以,在我们看到这个动画就非常流畅。
单纯的动画还不足以满足我们的需求,在动画执行的过程中,我们还需要一些动态效果,这有点类似于电影的慢动作,有时候我们需要它慢一点,有时候需要快一点,这样动画也变得生动起来。这些动态效果就是通过插值器(TimeInterpolator)实现的,我们只需要对Animation对象设置不同的插值器就可以实现不同的动态效果。
LinearInterpolator、AccelerateInterpolator、CycleInterpolator等实现Interpolator,通过getInterpolator(float input)获取当前的时间百分比,以此来计算动画的属性值。
八、总结
策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。这个模式很好地演示了开闭原则,也就是定义抽象,注入不同的实现,从而达到很好的可扩展性。
优点:
结构清晰明了、使用简单直观。
耦合度相对较低,扩展方便。
操作封装也更为彻底,数据更为安全。
缺点:
随着策略的增加,子类也会变得繁多。
更多关于 Android 相关内容感兴趣的读者可以查看本站专题:《Android 开发入门与进阶教程》、《Android 调试技巧与常见问题解决方法汇总》、《Android 基本组件用法总结》、《Android 视图 View 技巧总结》、《Android 布局 layout 技巧总结》以及《Android 控件用法总结》
希望本文所述对大家的 Android 程序设计有所帮助。
声明:本文内容来自网络,版权归原作者所有。内容由互联网用户自发贡献并自行上传,本网站不拥有所有权,未进行人工编辑处理,也不承担相关法律责任。如果您发现涉嫌版权的内容,请发送邮件至:notice#oldtoolbag.com(在发送邮件时,请将#替换为@进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权的内容。)