Parcourir la source

change abstract_factory

luoxing il y a 11 ans
Parent
commit
e59aabd10c
3 fichiers modifiés avec 26 ajouts et 67 suppressions
  1. 3 14
      abstract_factory.py
  2. 0 11
      adapter.py
  3. 23 42
      chain.py

+ 3 - 14
abstract_factory.py

@@ -7,20 +7,17 @@
 
 import random
 
-
 class PetShop:
 
     """A pet shop"""
 
     def __init__(self, animal_factory=None):
-        """pet_factory is our abstract factory.
-        We can set it at will."""
+        """pet_factory is our abstract factory.  We can set it at will."""
 
         self.pet_factory = animal_factory
 
     def show_pet(self):
-        """Creates and shows a pet using the
-        abstract factory"""
+        """Creates and shows a pet using the abstract factory"""
 
         pet = self.pet_factory.get_pet()
         print("We have a lovely {}".format(pet))
@@ -55,19 +52,12 @@ class DogFactory:
     def get_pet(self):
         return Dog()
 
-    def get_food(self):
-        return "dog food"
-
 
 class CatFactory:
 
     def get_pet(self):
         return Cat()
 
-    def get_food(self):
-        return "cat food"
-
-
 # Create the proper family
 def get_factory():
     """Let's be dynamic!"""
@@ -76,9 +66,8 @@ def get_factory():
 
 # Show pets with various factories
 if __name__ == "__main__":
-    shop = PetShop()
     for i in range(3):
-        shop.pet_factory = get_factory()
+        shop = PetShop(get_factory())
         shop.show_pet()
         print("=" * 20)
 

+ 0 - 11
adapter.py

@@ -5,39 +5,28 @@
 
 import os
 
-
 class Dog(object):
-
     def __init__(self):
         self.name = "Dog"
-
     def bark(self):
         return "woof!"
 
-
 class Cat(object):
-
     def __init__(self):
         self.name = "Cat"
-
     def meow(self):
         return "meow!"
 
-
 class Human(object):
-
     def __init__(self):
         self.name = "Human"
-
     def speak(self):
         return "'hello'"
 
 
 class Car(object):
-
     def __init__(self):
         self.name = "Car"
-
     def make_noise(self, octane_level):
         return "vroom{0}".format("!" * octane_level)
 

+ 23 - 42
chain.py

@@ -3,69 +3,50 @@
 
 """http://www.testingperspective.com/wiki/doku.php/collaboration/chetan/designpatternsinpython/chain-of-responsibilitypattern"""
 
-
 class Handler:
-
-    def __init__(self):
-        self._successor = None
-
-    def successor(self, successor):
-        self._successor = successor
-
-    def handle(self, request):
+    def __init__(self,successor):
+        self._successor = successor;
+    def handle(self,request):
+        i = self._handle(request)
+        if  not i:
+            self._successor.handle(request)
+    def _handle(self, request):
         raise NotImplementedError('Must provide implementation in subclass.')
 
 
 class ConcreteHandler1(Handler):
 
-    def handle(self, request):
+    def _handle(self, request):
         if 0 < request <= 10:
             print('request {} handled in handler 1'.format(request))
-        elif self._successor:
-            self._successor.handle(request)
-
-
+            return True
+            
 class ConcreteHandler2(Handler):
-
-    def handle(self, request):
+    
+    def _handle(self, request):
         if 10 < request <= 20:
             print('request {} handled in handler 2'.format(request))
-        elif self._successor:
-            self._successor.handle(request)
-
-
+            return True
+        
 class ConcreteHandler3(Handler):
-
-    def handle(self, request):
+    
+    def _handle(self, request):
         if 20 < request <= 30:
             print('request {} handled in handler 3'.format(request))
-        elif self._successor:
-            self._successor.handle(request)
-
-
+            return True
 class DefaultHandler(Handler):
-
-    def handle(self, request):
-            print('end of chain, no handler for {}'.format(request))
+    
+    def _handle(self, request):
+        print('end of chain, no handler for {}'.format(request))
+        return True
 
 
 class Client:
-
     def __init__(self):
-        h1 = ConcreteHandler1()
-        h2 = ConcreteHandler2()
-        h3 = ConcreteHandler3()
-        h4 = DefaultHandler()
-
-        h1.successor(h2)
-        h2.successor(h3)
-        h3.successor(h4)
-
-        self.handlers = (h1, h2, h3, h4,)
-
+        self.handler = ConcreteHandler1(ConcreteHandler3(ConcreteHandler2(DefaultHandler(None))))
     def delegate(self, requests):
         for request in requests:
-            self.handlers[0].handle(request)
+            self.handler.handle(request)
 
 
 if __name__ == "__main__":